簡體   English   中英

可以在SQL Server中聲明一個提供列名的常量嗎?

[英]It is possible to declare a constant in SQL Server which provides the column name?

我想問你是否可以在SQL Server中聲明一個提供列名的常量?

意思是這樣的:

declare @column varchar(30)
set @column = 'Column1'

SELECT @column FROM Table1

我知道上面的聲明是錯誤的,但也許是為自己提供列名的解決方案。

我想顯示Column1結果,但如果Column1在''內,那么將返回(No column name)附加列名,所有行的結果將是Column1

謝謝

您不能在SQL中使用動態列名稱。

為此,您需要使用動態SQL。 我建議閱讀Erland Sommarskog 的動態SQL的詛咒和祝福,以獲得關於這個問題的完整觀點 - 文章很長但很全面。

使用動態SQL可以向您公開SQL注入 ,因此請謹慎使用。

為此你需要使用動態查詢,如果你使用slq服務器可以使用sp_execute exeucte

DECLARE @SQLString nvarchar(1000)
declare @column varchar(30)  
set @column = 'Column1'
SET @SQLString  = 'SELECT ' + @column + ' in Table1 '
EXECUTE sp_executesql @SQLString

總之,不,你不能那樣做。 你需要使用動態sql。

使用動態SQL

代碼將是這樣的:

DECLARE @sqlCommand nvarchar(1000)
DECLARE @column varchar(75)
SET @column = 'Column1'
SET @sqlCommand = 'SELECT ' + @column + ' from Table1'
EXECUTE sp_executesql @sqlCommand, N'@column nvarchar(75)', @column = @column

有關sp_executesql的更多信息,請檢查此信息


就像@Oded所說,使用這種類型的解決方案可以進行SQL注入!

declare @query varchar(100)
set @query = 'select Column1 from table1'
exec (@query)

正如你自己所說,上述聲明是不正確的。 但是您可以將整個查詢存儲為動態sql並使用Exec()運行它。

對於你的情況,它將是:

declare @column varchar(30)
set @column = 'Column1'

declare @sqlSelect varchar(500)

set @sqlSelect = 'SELECT ' + @column + ' in Table1'
Exec( @sqlSelect )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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