【问题标题】:'WHERE IN' in T-SQL [duplicate]T-SQL中的'WHERE IN' [重复]
【发布时间】:2011-01-19 20:38:59
【问题描述】:

可能的重复:
Parameterizing a SQL IN clause?
Is it possible to use query parameters to fill the IN keyword

您好,我在我的 SQL 查询中使用 WHERE IN,因为用户可能需要输入多个 id 来显示 的记录,以逗号分隔。我现在有这个:

WHERE Consignments.ID IN(@ID) 

@ID 将是由逗号分隔的 ID 列表。问题是当我的参数有一个数字时它可以工作 - 如果有多个,那么它不会返回任何行。有什么想法吗?

【问题讨论】:

标签: c# sql tsql


【解决方案1】:

In 不能以这种方式使用。您需要通过动态创建 SQL 来做到这一点。

DECLARE @sql VARCHAR(200);
DECLARE @id VARCHAR(200);

SET @sql = 'SELECT * FROM Table WHERE Consignments.ID IN (' + @id + ')';

EXEC sp_executesql @sql;

【讨论】:

  • +1 这是 SQL 变体,你也可以在 C# 中生成 SQL 并将其作为 CommandText 传递
  • 这不是一个安全的解决方案,而且性能低下
  • @Jani:当然同意安全性,但我只是在展示如何做到这一点:o)
【解决方案2】:

您需要使用动态 sql 或将存储过程与输入变量中的表变量一起使用。

【讨论】:

  • +1,SQL 2008 中的 TVP 是处理此问题的正确方法
【解决方案3】:

您需要将参数以逗号分隔,而不仅仅是传递一串以逗号分隔的 ID。

WHERE Consignments.ID IN(@ID1,@ID2,@ID3,...)

【讨论】:

  • 但是,你需要预先知道你的 IN 子句应该包含多少个值。
  • 看看@Ardman 的例子用SQL 做吧。
【解决方案4】:

当该参数必须在 IN 子句中使用时,您不能在 SQL 语句中使用参数。

原因很简单,当参数包含多个值时,你必须将其定义为字符串,因为 1、5、6 不是有效数字(假设 ID 是数字字段)。

因此,您必须使用字符串连接才能完成这项工作。

This 是一个类似的话题,几天前。

【讨论】:

    【解决方案5】:

    它应该是一个逗号分隔的值列表或在查询中选择的 ID:

    WHERE Consignments.ID IN('1','2')

    WHERE Consignments.ID IN(SELECT ID FROM <Table | View>)

    【讨论】:

      【解决方案6】:

      您不能将文字逗号分隔值作为参数传递给IN,因为IN 会将变量解析为一个集合(一个项目,一个字符串),而不是从您的文字创建一个集合。

      如果您想这样做,您需要将整个语句存储为字符串,然后使用EXEC 运行它...这将使您的查询不可分割并且容易受到注入。

      如果您有 SQL 2008,则应该改用 TVP。您实际上将传入一组值的表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-21
        • 2016-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 1970-01-01
        相关资源
        最近更新 更多