2017-04-14 16 views
0

我有一个问题编号参数'@QNumber varchar(5)'(值:Q8,Q9和Q10) Q8,Q9和Q10是实际的SQL列名称,我使用@Parameter动态地传递值Q8,Q9和Q10,即使它们不是,计数总是相同的。使用@parameter作为SQL列的TSQL

declare @qnumber varchar(5) = 'Q8' 
select total = count(*) 
from table1 
where @qnumber is not null 
+2

你有问题,因为你的一些数据* *(问题数)反而被嵌入在* *元数据(这里,列名)。如果重新设计表格以便每个问题都占据其自己的*行,并且问题编号实际上存在于列中,则为* data *,则该查询很容易编写。 –

+2

您**不能**在常规T-SQL查询中参数化表或列名称。如果你必须这样做,除了使用动态SQL **以及所有的瑕疵和缺陷,别无选择...... –

回答

0

当您传递列名作为参数时,不能将其用作普通变量。动态格式化查询并执行它。

declare @qnumber varchar(5) 
declare @sqlQuery nvarchar(1000) 
set @qnumber='Q8' 
select total=count(*) from table1 where @qnumber is not null 
set @sqlQuery = N'SELECT total=count(*) from table1 where ' + @qnumber + ' is not null' 
exec (@sqlQuery) 
+1

[QUOTENAME](https://docs.microsoft.com/en-us/sql/t- sql/functions/quotename-transact-sql)在这里需要防范SQL注入。 –

0

这可能会实现:

DECLARE @qnumber varchar(5) = 'Q8' 
DECLARE @sqlQuery NVARCHAR(500) = 
'select total = count(*) from table1 where' + @qnumber +' is not null' 
EXEC (@sqlQuery)