2015-06-09 103 views
1

我有一些奇怪的要求。我需要串聯字符串作爲ms-sql中的列別名。列別名中的連接字符串

對於。例如,

問題:

@declare @columnName as nvarchar(10)='2015'  
select 1 as [Rank in @columnName] 

預期輸出:

------------------ 
| Rank in 2015 | 
------------------ 
|  1  | 
------------------ 

編輯:我會很樂意不要使用動態SQL做它,如果它不是隻有選件

編輯:

我從sql做這個的原因是我沒有這樣的前端。

我們實際上正在向用戶提供數據,這些用戶又是前端開發人員,他們可能會使用這些數據並構建他們自己的界面,考慮到我想發佈的數據集本身就有意義而不必提及它明確。

我希望你有這個想法。

+5

No way ............創建動態sql –

+0

查看示例查詢,我可以冒險想要在此處進行旋轉的猜測,例如, http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx – HingeSight

回答

1

下面是一個合理的解決方案:

declare @columnName nvarchar(10) = '2015'; 
declare @sql nvarchar(max) = 'select @value as ' + quotename('Rank in ' + columnName); 

exec sp_executesql @sql, N'@value int', @value = @value; 

多一點的時間討論。如果您要根據現有列名稱獲取新列名稱,則需要在查詢中修改更多內容。對於動態SQL,我強烈建議您僅在exec之前熟悉sp_executesql--它允許您將參數傳入和傳出執行環境。除了有用之外,這有助於防範SQL注入攻擊。

這就是說,我認爲你應該給列通用名稱和處理列命名在任何應用程序正在運行查詢。這聽起來像列標題的選擇是爲了滿足一些用戶。他們可能會變得浮躁並改變主意,或者不同的用戶可能需要不同的列標題。在應用層處理這個問題意味着而不是需要更改SQL代碼。而且,從長遠來看,更多的本地化變更更安全。

+0

我知道這個解決方案,但現在它更具說服力,謝謝你。很好地說。 +1 –

0

你能做到在下面,但它的動態SQL:

DECLARE @columnName NVARCHAR(10) = '2015]' 
EXEC ('SELECT ''1'' AS [Rank in ' + @columnName)