我有一个问题编号参数'@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
我有一个问题编号参数'@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
SQL Server将不会接受一个表名或列名作为参数。如果您尝试使用sp_executesql执行此操作。
当您传递列名作为参数时,不能将其用作普通变量。动态格式化查询并执行它。
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)
[QUOTENAME](https://docs.microsoft.com/en-us/sql/t- sql/functions/quotename-transact-sql)在这里需要防范SQL注入。 –
这可能会实现:
DECLARE @qnumber varchar(5) = 'Q8'
DECLARE @sqlQuery NVARCHAR(500) =
'select total = count(*) from table1 where' + @qnumber +' is not null'
EXEC (@sqlQuery)
你有问题,因为你的一些数据* *(问题数)反而被嵌入在* *元数据(这里,列名)。如果重新设计表格以便每个问题都占据其自己的*行,并且问题编号实际上存在于列中,则为* data *,则该查询很容易编写。 –
您**不能**在常规T-SQL查询中参数化表或列名称。如果你必须这样做,除了使用动态SQL **以及所有的瑕疵和缺陷,别无选择...... –