2011-12-10 76 views
6

我有一个数据库字段名呼叫Code,我试图用一个变量名像下面这样来选择它:动态选择SQL查询列

Declare @var1 = [Code] 

(SELECT @var1 
FROM [VoucherType] 
WHERE [DeletedBy] IS NULL 
AND [AutoID] = 1) 

显然,SQL将解释@var1作为一个字符串,而不是我的数据库字段,我怎么能这样做@var1被认为是字段名称[Code],而不是没有任何选择或if语句的字符串。

回答

9

试试这个:

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

+0

为sp_executesql +1和一个很好的答案。 –

+0

'+ @ var1 +'应该是'+ QUOTENAME(@ var1)+',以避免列名中的空格和其他可能的特殊字符出现问题。它还有助于防止可能的注射问题。另外,如果您正在编写逗号分隔列表,则应通过QUOTENAME传递每个单独的列名称。 – JamieSee

2

您不能在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 

请务必阅读:The Curse and Blessings of Dynamic SQL

2

你需要使用动态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

问候

+1

应避免使用'EXEC'来支持'sp_executesql',因为它更高效:[参考](http://msdn.microsoft.com/en-us/library/ms175170.aspx) –

0

请下面的代码尝试:

DECLARE @ var1的VARCHAR(50)

SET @var1 = '[Code]' 

EXEC ('SELECT ' + @var1 + ' FROM [VoucherType] 
     WHERE [DeletedBy] IS NULL AND [AutoID] = 1 ') 
+2

应避免使用'EXEC'来支持'sp_executesql',因为它更高效:[reference](http://msdn.microsoft.com/zh-cn/library/ms175170.aspx) –