1

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

意思是这样的:

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

SELECT @column FROM Table1

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

我想显示结果,Column1但如果Column1在 '' 内,则将返回(No column name)附加列名,所有行的结果都是Column1.

谢谢

4

6 回答 6

2

您不能在 SQL 中使用动态列名。

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

使用动态 SQL 会使您暴露于SQL 注入,因此请谨慎使用。

于 2012-04-19T09:33:34.863 回答
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
于 2012-04-19T09:34:36.893 回答
0

简而言之,不,你不能那样做。您需要使用动态sql。

于 2012-04-19T09:32:57.073 回答
0

使用动态 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 注入!

于 2012-04-19T09:33:53.750 回答
0
declare @query varchar(100)
set @query = 'select Column1 from table1'
exec (@query)
于 2012-04-19T09:34:46.903 回答
0

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

对于您的情况,它将是:

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

declare @sqlSelect varchar(500)

set @sqlSelect = 'SELECT ' + @column + ' in Table1'
Exec( @sqlSelect )
于 2012-04-19T09:35:40.177 回答