我想问你是否可以在提供列名的 SQL Server 中声明一个常量?
意思是这样的:
declare @column varchar(30)
set @column = 'Column1'
SELECT @column FROM Table1
我知道上面的声明是错误的,但也许是为自己提供列名的解决方案。
我想显示结果,Column1但如果Column1在 '' 内,则将返回(No column name)附加列名,所有行的结果都是Column1.
谢谢
我想问你是否可以在提供列名的 SQL Server 中声明一个常量?
意思是这样的:
declare @column varchar(30)
set @column = 'Column1'
SELECT @column FROM Table1
我知道上面的声明是错误的,但也许是为自己提供列名的解决方案。
我想显示结果,Column1但如果Column1在 '' 内,则将返回(No column name)附加列名,所有行的结果都是Column1.
谢谢
您不能在 SQL 中使用动态列名。
为此,您需要使用动态 SQL。我建议阅读Erland Sommarskog的 The Curse and Blessings of Dynamic SQL以全面了解这个问题——这篇文章很长但很全面。
使用动态 SQL 会使您暴露于SQL 注入,因此请谨慎使用。
为此,您需要使用动态查询,如果您使用的是 slq 服务器,则可以使用 sp_execute 执行
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 )