select Staff_ID, First_Name, Last_Name
from YourTable
order by cast(Staff_ID as varchar(10))+First_Name+Last_Name,
Staff_ID
NULL
værdier vil blive bestilt først.
Når du sammenkæder en værdi med NULL
resultatet er NULL
så First_Name+Last_Name
vil være NULL
hvis nogen er NULL
.
cast(Staff_ID as varchar(10))+...
er der garanti for den rækkefølge, du ønsker for sagen, når First_Name+Last_Name
er ikke NULL
(Jeg går ud fra Staff_ID
er int
).
Og den ekstra rækkefølge efter kolonne Staff_ID
er der for at garantere den ønskede rækkefølge for alle rækker, hvor First_Name+Last_Name
er NULL
Opdater
Du kan bygge forespørgslen dynamisk ved hjælp af INFORMATION_SCHEMA.COLUMNS. Dette kan gøre, hvad du vil. Bemærk, dette er ikke testet for alle slags datatyper.
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)
Opdatering 2
En ikke-dynamisk version, der bruger XML i stedet for.
;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')
Opdatering 3
Hvis du kender den primære nøgle i din tabel og ikke har noget imod at skrive where-sætningen, kan du bruge denne i stedet for at bruge 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')