select Staff_ID, First_Name, Last_Name from YourTable order by cast(Staff_ID as varchar(10))+First_Name+Last_Name, Staff_ID
プレ>
NULL
値が最初に並べられます。
NULL
で値を連結する場合 結果はNULL
です だからFirst_Name+Last_Name
NULL
になります いずれかがNULL
の場合 .
cast(Staff_ID as varchar(10))+...
First_Name+Last_Name
の場合に必要な順序が保証されていますか? そうではないNULL
(私はStaff_ID
を想定していますint
です ).そして列
Staff_ID
による余分な順序First_Name+Last_Name
のすべての行に対して必要な順序を保証するためにありますか はNULL
更新
INFORMATION_SCHEMA.COLUMNS を使用して動的にクエリを作成できます。これはあなたが望むことをするかもしれません。これは、すべての種類のデータ型に対してテストされているわけではないことに注意してください。
declare @TableName sysname = 'YourTable' declare @Sql nvarchar(max) = 'select * from '+quotename(@TableName)+ ' order by ' select @Sql = @Sql+'+cast('+COLUMN_NAME+' as varchar(max))' from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName exec (@Sql)
プレ>アップデート 2
代わりに XML を使用した非動的バージョン。
;with C as ( select *, row_number() over(order by (select 1)) as rn from YourTable ) select C1.* from C as C1 cross apply (select * from C as C2 where C1.rn = C2.rn for xml path('x'), type) as T(N) order by T.N.value('count(/x/*)', 'int')
プレ>アップデート 3
テーブルの主キーが分かっていて、where 句を入力してもかまわない場合は、
row_number()
を使用する代わりにこれを使用できます。 .select Y1.* from YourTable as Y1 order by (select * from YourTable as Y2 where Y1.Staff_ID = Y2.Staff_ID for xml path('x'), type).value('count(/x/*)', 'int')
プレ>