我有以下 sql 命令
DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols ',[' cast(Month as nvarchar(2)) ']' , '[' Cast(Month as nvarchar(2)) ']')
FROM (select distinct Month from Employee WHERE Year*100 Month BETWEEN 201704 and 201712 ) as e
PRINT @cols
結果是
[9],[12],[6],[7],[10],[4],[5],[11],[8]
但我真的希望它產生排序順序
[4],[5],[6],[7],[8],[9],[10],[11],[12]
uj5u.com熱心網友回復:
變數合并被記錄為非確定性的,可能會導致不正確的結果,特別是在ORDER BY. 您也不能放置ORDER BY在派生表或視圖中,原因很明顯:最終排序僅由外部查詢確定。
您應該改為使用STRING_AGG聚合。您可以使用WITHIN GROUP (ORDER BY來獲取訂單。
另請注意:
- 總是使用
QUOTENAME括號括住您的列名,而不是自己做,因為轉義可能很復雜。 - 最好對列進行精確比較,而不是對它們進行計算然后進行比較,因為這樣您就可以找到索引(sarge 能力)。
- 將日期存盤在實際日期列中可能更好,而不是與多個列混在一起,但我會將資料庫重新設計留給您
DECLARE @cols NVARCHAR(MAX) = (
SELECT STRING_AGG(QUOTENAME(Month), N',') WITHIN GROUP (ORDER BY Month)
FROM (
select distinct
Month
from Employee
WHERE Year = 2017
AND Month BETWEEN 4 AND 12
) as e
);
對于 SQL Server 2016 及更早版本,您可以使用舊FOR XML方法:
DECLARE @cols NVARCHAR(MAX) = STUFF((
SELECT N',' QUOTENAME(Month)
FROM (
select distinct
Month
from Employee
WHERE Year = 2017
AND Month BETWEEN 4 AND 12
) as e
ORDER BY Month
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)')
, 1, LEN(N','), N'');
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/394871.html
標籤:sql sql-server 查询语句
上一篇:在Case陳述句SQL中使用陣列
