我有一个数据库字段名呼叫Code
,我试图用一个变量名像下面这样来选择它:动态选择SQL查询列
Declare @var1 = [Code]
(SELECT @var1
FROM [VoucherType]
WHERE [DeletedBy] IS NULL
AND [AutoID] = 1)
显然,SQL将解释@var1
作为一个字符串,而不是我的数据库字段,我怎么能这样做@var1
被认为是字段名称[Code]
,而不是没有任何选择或if语句的字符串。
我有一个数据库字段名呼叫Code
,我试图用一个变量名像下面这样来选择它:动态选择SQL查询列
Declare @var1 = [Code]
(SELECT @var1
FROM [VoucherType]
WHERE [DeletedBy] IS NULL
AND [AutoID] = 1)
显然,SQL将解释@var1
作为一个字符串,而不是我的数据库字段,我怎么能这样做@var1
被认为是字段名称[Code]
,而不是没有任何选择或if语句的字符串。
试试这个:
DECLARE @var1 VARCHAR(20)
DECLARE @sql VARCHAR(255)
SET @var1 = 'Code'
SET @sql = 'select ' + @var1 + ' from [VoucherType] where [DeletedBy] is null and [AutoID] = 1'
EXEC sp_executesql @sql
您必须撰写动态查询并执行sp_executesql
要在事物的“动态”一侧添加更多内容,请使用存储过程。在这里看到的例子:
http://www.marten-online.com/database/execute-dynamic-sql-in-mssql.html
那......是,如果你使用Microsoft SQL Server
您不能在SELECT语句中使用类似的变量。
您将需要创建动态TSQL。
你不指定RDBMS,但在SQL Server中,你会使用sp_executesql
(最好)或EXEC
Declare @var1 varchar(100)
Declare @sql varchar(1000)
SET @var1 = '[Code]'
SET @sql = ' select ' + @var1 + ' from [VoucherType]' +
' where [DeletedBy] is null and [AutoID] = 1'
EXEC sp_executesql @sql
你需要使用动态SQL。
declare @ColName varchar(128)
declare @sql varchar(4000)
Set @ColName='Code';
select @sql = 'SELECT '[email protected]+'
FROM [VoucherType]
WHERE [DeletedBy] IS NULL
AND [AutoID] = 1'
exec sp_executesql @sql
go
此信息可能会有所帮助
Accessing a table from a name in a variable
SQL: Select dynamic column name based on variable
问候
应避免使用'EXEC'来支持'sp_executesql',因为它更高效:[参考](http://msdn.microsoft.com/en-us/library/ms175170.aspx) –
请下面的代码尝试:
DECLARE @ var1的VARCHAR(50)
SET @var1 = '[Code]'
EXEC ('SELECT ' + @var1 + ' FROM [VoucherType]
WHERE [DeletedBy] IS NULL AND [AutoID] = 1 ')
应避免使用'EXEC'来支持'sp_executesql',因为它更高效:[reference](http://msdn.microsoft.com/zh-cn/library/ms175170.aspx) –
为sp_executesql +1和一个很好的答案。 –
'+ @ var1 +'应该是'+ QUOTENAME(@ var1)+',以避免列名中的空格和其他可能的特殊字符出现问题。它还有助于防止可能的注射问题。另外,如果您正在编写逗号分隔列表,则应通过QUOTENAME传递每个单独的列名称。 – JamieSee