【问题标题】:How to add my condition on concatenated query SQL Server如何在连接查询 SQL Server 上添加我的条件
【发布时间】:2020-05-10 15:59:38
【问题描述】:

我想在我的SQL Server 查询中添加我的动态条件,但发现我应该使用串联查询。

我是串联查询的新手。这是我尝试过的以下查询,但系统税不正确。

DECLARE @value VARCHAR(500) = ' and ID IN (1,2)';
DECLARE @sql VARCHAR(MAX);


SET @sql = '
DECLARE @table TABLE
(
    ID INT,
    Amount INT,
    Name VARCHAR(500)
);

DELETE FROM @table
INSERT INTO @table
(
    ID,
    Amount,
    Name
)
VALUES
(1, 200, ''ab''),
(2, 300, ''ab''),
(3, -150, ''ac''),
(4, 200, ''ab'');

select SUM(Amount)
from @table
where name = ''ab'' ''' + @value + ''';';
EXEC (@sql);

在我的串联查询中添加条件查询变量的正确方法是什么。

【问题讨论】:

  • 您遇到的错误是什么?
  • 这看起来像是注射问题,如果我见过的话。
  • '和 ID IN (1,2)' 附近的语法不正确。
  • 停止盲目应用模式。如果您声明一个表变量,则绝对不需要在声明后立即从该表变量中删除行。那时它不可能有任何行。事实上,你为什么需要一个表变量呢?只需使用table value constructor

标签: sql sql-server tsql concatenation dynamic-sql


【解决方案1】:

您的代码有问题:

  • delete 语句末尾缺少半列
  • where name = ''ab'' 和代码末尾提取引号

这应该可行:

DECLARE @value VARCHAR(500) = ' and ID IN (1,2)';
DECLARE @sql VARCHAR(MAX);

SET @sql = '
DECLARE @table TABLE
(
    ID INT,
    Amount INT,
    Name VARCHAR(500)
);

DELETE FROM @table;
INSERT INTO @table
(
    ID,
    Amount,
    Name
)
VALUES
(1, 200, ''ab''),
(2, 300, ''ab''),
(3, -150, ''ac''),
(4, 200, ''ab'');

select SUM(Amount)
from @table
where name = ''ab'' ' + @value + ';';
EXEC(@sql);

注意事项:

  • 这称为 动态 SQL 而不是 串联查询
  • 调试此类代码的一种简单方法是将EXEC(@sql) 命令替换为SELECT @sql,这样您就可以看到代码生成的SQL;在this DB Fiddle,你可以看到结果:
DECLARE @table TABLE
(
    ID INT,
    Amount INT,
    Name VARCHAR(500)
);

DELETE FROM @table;
INSERT INTO @table
(
    ID,
    Amount,
    Name
)
VALUES
(1, 200, 'ab'),
(2, 300, 'ab'),
(3, -150, 'ac'),
(4, 200, 'ab');

select SUM(Amount)
from @table
where name = 'ab'  and ID IN (1,2);

【讨论】:

  • 您是否检查过此代码不起作用并给出错误 - Msg 105, Level 15, State 1, Line 24 字符串';'后面的未闭合引号。
  • 在下面的查询中最后一行包含一个额外的单引号,请查看。
【解决方案2】:

您可以删除多余的引号:

where name = ''ab'' ' + @value + ';';

【讨论】:

  • 它有效,问题是我已将变量值设置为字符串。谢谢!
【解决方案3】:

您好使用下面的修改查询

DECLARE @value VARCHAR(500) = ' and ID IN (1,2)';
DECLARE @sql VARCHAR(MAX);


SET @sql = '
DECLARE @table TABLE
(
    ID INT,
    Amount INT,
    Name VARCHAR(500)
);

DELETE FROM @table
INSERT INTO @table
(
    ID,
    Amount,
    Name
)
VALUES
(1, 200, ''ab''),
(2, 300, ''ab''),
(3, -150, ''ac''),
(4, 200, ''ab'');

select SUM(Amount)
from @table
where name = ''ab''' + @value+';'
EXEC (@sql);

查询输出:500

【讨论】:

    猜你喜欢
    • 2018-03-08
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多