簡體   English   中英

為什么不能動態設置列的別名?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM