【问题标题】:SQL Server Query using a Dynamic Column Name使用动态列名的 SQL Server 查询
【发布时间】:2020-02-19 10:02:17
【问题描述】:

我正在尝试对优先级矩阵进行 SQL 查询。因此,我想动态传递列名,然后还基于也具有动态值的 where 子句进行过滤。

我在 Stackoverflow 上找到了一些有用的答案,但到目前为止他们只得到了我,现在我有点卡住了。谁能看到我哪里出错了?

查询我有问题:

DECLARE @var1 VARCHAR(50)
DECLARE @var2 VARCHAR(50)
DECLARE @sql VARCHAR(255)

SET @var1 = 'partial impact'
SET @var2 = 'single user'
SET @sql = 'select [' + @var1 + '] from [priority matrix] where impact is ['+ @var2 + ']'

EXECUTE(@sql);

不是动态的并且工作正常的查询:

SELECT [partial impact] 
FROM priorityMatrix 
WHERE impact = 'single user';

我在运行时看到的错误:

消息 102,级别 15,状态 1,第 1 行 “单个用户”附近的语法不正确。

到目前为止有帮助的 Stackoverflow 查询:

SQL Server + Dynamic Query 'Invalid Column Name' How to set variable from a SQL query?

【问题讨论】:

  • 您是否尝试过像在非动态查询中那样包含等号?目前,您有一个is...此外,您从中选择的表名与工作查询中的表名不同。

标签: sql sql-server


【解决方案1】:

IS =,所以你需要修复它:

SET @sql = 'select [' + @var1 + '] from [priority matrix] where impact  = ['+ @var2 + ']';

我会使用 QUOTENAME() 而不是手动 [] :

SET @sql = 'SELECT '+ QUOTENAME(@var1) +' FROM [priority matrix] WHERE impact  = '''+@var2+'''';

文字字符串用单引号括起来,[] 不是必需的。

【讨论】:

  • 不知道@var2 的值是否可以由最终用户提供。如果是这样,@var2 的值中的任何单引号字符都应该加倍(' -> '')以避免 SQL 注入攻击:WHERE impact = ''' + REPLACE(@var2, '''', '''''') + ''''
猜你喜欢
  • 1970-01-01
  • 2010-09-20
  • 2017-01-11
  • 2014-01-09
  • 2013-10-07
  • 1970-01-01
  • 2012-05-11
相关资源
最近更新 更多