使用动态列名的SQL Server查询

23 浏览
0 Comments

使用动态列名的SQL Server查询

我正在尝试在优先级矩阵上执行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';

运行时出现的错误:

Msg 102, Level 15, State 1, Line 1

附近的语法不正确,'single user'。

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

SQL Server + Dynamic Query 'Invalid Column Name'

How to set variable from a SQL query?

0
0 Comments

SQL Server查询使用动态列名的问题是由于代码中使用了错误的语法造成的。在代码中,使用了不正确的运算符“<>”,而应该使用“=”来比较。解决方法是将代码中的“<>”替换为“=”。

代码示例如下:

SET @query = 'select [' + @column + '] from [priority matrix] where impact = ['+ @impact + ']';

另一种解决方法是使用`QUOTENAME()`函数来动态引用列名,而不是手动使用方括号`[]`。这种方法更加简洁和安全。

代码示例如下:

SET @query = 'SELECT '+ QUOTENAME(@column) +' FROM [priority matrix] WHERE impact = ''' + @impact + '''';

需要注意的是,在SQL中,字符串使用单引号括起来,不需要使用方括号`[]`。如果待查询的列名或者查询条件的值是由用户输入的,为了避免SQL注入攻击,应该对值中的单引号进行转义,即将单引号替换为两个单引号。

代码示例如下:

SET @query = 'SELECT '+ QUOTENAME(@column) +' FROM [priority matrix] WHERE impact = ''' + REPLACE(@impact, '''', '''''') + '''';

通过以上的修改,可以解决SQL Server查询使用动态列名的问题。

0