我想问你是否可以在提供列名的 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 )