[英]Why is it not possible to set a column's alias dynamically?
我有一個存儲過程,我想將列別名作為參數傳遞,例如:
SELECT u.userLoginName AS @columnName
FROM -- some JOINs
WHERE -- some conditions
其中@columnName
可以是兩個選項之一,它根據某些條件設置在 SELECT 語句之前。 我已經知道只能通過動態SQL來完成,但我不明白為什么?
我知道查詢的執行順序是:FROM and JOINs -> WHERE -> GROUP BY 然后才 SELECT。
因此,如果此時我已經得到了結果集,即最終表,為什么我不能將列名重命名為@columnName
呢? 我想念的背景中發生了什么?
這可能會回答你的問題。
SQL 結果集在概念上就像一個表:它具有明確定義的行和列,並且沒有排序,除非使用明確的order by
創建。
SQL 查詢分兩個階段處理:編譯和優化,然后運行。 (令人高興的是,一些數據庫現在也開始提供動態優化,但編譯階段的查詢仍然是 go。)
在編譯階段需要了解有關結果集的所有信息——包括生成的列名和列類型。 動態名稱可以防止這種情況發生。 他們只會在執行階段才知道。
請注意,這也適用於作為標識符的參數。 參數在執行階段開始時被替換。
這不是任何特定數據庫的限制。 它適用於所有這些。 我懷疑一些更現代的數據庫是以允許更多動態命名的方式實現的,但我不知道任何實際實現它的數據庫,除了通過動態 SQL。
這是可能的,但你必須使用動態查詢。 假設我們有下表
Create table #TBL ([Months] VARCHAR(3), Value INT)
INSERT INTO #TBL values
('Jan',20),('Feb',12),('Jan',15),('Mar',25),
('Feb',18),('Jan',9),('Mar',10),('Jan',19)
GO
我想使用變量動態設置列名。 我可以使用下面的代碼
DECLARE @M VARCHAR(10)='Months',
@T VARCHAR(10)='Total'
-- Dynamic query to get the column name
DECLARE @qry VARCHAR(MAX)
SET @qry = 'SELECT [Months] AS '+@M+',
sum(Value) as '+@T+'
FROM #TBL
group by [Months]
DROP TABLE #TBL'
EXEC (@qry)
注意查詢本身必須是動態的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.