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