【问题标题】:SQL SELECT Statement - Multiple IDs in IN Clause [duplicate]SQL SELECT 语句 - IN 子句中的多个 ID [重复]
【发布时间】:2013-01-07 16:08:50
【问题描述】:

可能重复:
Parameterizing an SQL IN clause?

我时不时地在一个允许用户选择多个项目然后对它们执行批量操作的系统上工作。通常,我会在运行时构建 SQL,如下所示:

string inClause = String.Join(", ", selectedIds);
string command = "SELECT * FROM Customer WHERE CustomerId IN ({0})";
command = String.Format(command, inClause);

当然,由于 SQL 注入,这种代码风格是不安全的。我可以通过放入参数占位符并创建参数来解决这个问题。

不过,我想知道是否还有另一种我没有考虑过的方法。我当然不想为每个 ID 执行一次命令。

【问题讨论】:

标签: sql sql-injection in-clause


【解决方案1】:

有两种很好的方法:

  1. 使用命令占位符构建字符串(如您所说)
  2. 加入 TVP 的价值观

将 ID 刻录到 SQL 中并不好,因为它会阻止计划缓存并打开注入的可能性。

【讨论】:

    【解决方案2】:

    您可以构建一个 XML 字符串,然后将其传递给存储过程。执行它看起来像:

    EXECUTE getLocationTypes '<IDList><ID>1</ID><ID>3</ID></IDList>' 
    

    存储的过程看起来像:

    create proc [dbo].[getLocationTypes](@locationIds XML)
    as  
    begin  
    set nocount on  
    
    SELECT locationId, typeId
    FROM xrefLocationTypes 
    WHERE locationId 
    IN (SELECT Item.value('.', 'int' )
    FROM @locationIDs.nodes('IDList/ID') AS x(Item))
    ORDER BY 1, 2
    
    end  
    

    注意参数的数据类型是XML。这比你正在做的要复杂一点,猜猜你可以在一个 SQL 字符串中完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 2021-12-23
      • 2010-11-10
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多