可以在SQL Server中声明一个提供列名的常量吗?

时间:2012-04-19 09:30:07

标签: sql sql-server sql-server-2005

我想问你是否可以在SQL Server中声明一个提供列名的常量?

意味着这样的事情:

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

SELECT @column FROM Table1

我知道上面的声明是错误的,但也许是为自己提供列名的解决方案。

我希望显示Column1的结果,但如果Column1位于''内,则会返回(No column name)个附加列名称,所有行的结果将为Column1

谢谢

6 个答案:

答案 0 :(得分:2)

您无法在SQL中使用动态列名。

为此,您需要使用动态SQL。我建议阅读Erland Sommarskog的The Curse and Blessings of Dynamic SQL来全面了解这个问题 - 这篇文章很长但很全面。

使用动态SQL可能会将您暴露给SQL injection,因此请小心使用。

答案 1 :(得分:1)

为此,您需要使用动态查询,如果您使用slq服务器,可以使用sp_execute执行

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

答案 2 :(得分:0)

总之,不,你不能那样做。你需要使用动态sql。

答案 3 :(得分:0)

使用dynamic 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的更多信息,请检查THIS


与@Oded一样,使用此类解决方案可以进行SQL注入!

答案 4 :(得分:0)

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

答案 5 :(得分:0)

正如您所说,上述声明不正确。但是您可以将整个查询存储为动态sql并使用Exec()运行它。

对于你的情况,它将是:

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

declare @sqlSelect varchar(500)

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