【问题标题】:Passing parameter to SQL select statement IN clause acts weird.将参数传递给 SQL 选择语句 IN 子句的行为很奇怪。
【发布时间】:2012-05-09 14:03:46
【问题描述】:

我有以下查询返回 2 条记录(在 DataSet 的查询构建器中)

SELECT        EmpID, Name, id
FROM          Users
WHERE        (CAST(id AS Varchar(20)) IN ('5688','5689'))

现在,如果我执行相同的查询,而不是从后面的代码中传递参数: String param = "'5688','5689'";它返回 null。

WHERE        (CAST(id AS Varchar(20)) IN (@param))

我试着去掉第一个和最后一个',但这并没有什么不同。

!!!id是唯一的PK!!!

有人知道吗?

【问题讨论】:

  • 能否请您发布包含指定参数的代码?

标签: c# sql dataset tableadapter query-builder


【解决方案1】:

我找到的解决方案很简单,这就像一个魅力,不需要sps或其他功能;

SQL:

SELECT whatever 
FROM whatever
WHERE (PATINDEX('%''' + CAST(id AS Varchar(20)) + '''%', @param) > 0)

C#:

String param = "'''1234'',''4567'''";
dataTable1 = tableAdapter1.getYourValues(param);

【讨论】:

  • 这里对如何做到这一点进行了相当全面的讨论。 stackoverflow.com/questions/337704/…
  • 这正是我所需要的。我的数据集设计器一直将我的参数默认为DbType = Object,SQL 不喜欢这样,所以我不得不将参数更新为DbType = String,但它就像一个魅力。
【解决方案2】:

IN 子句中不允许有变量。
您期望值作为逗号分隔的字符串,您可以使用拆分函数(用户定义和非标准)将它们与原始表连接:

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=326300&SiteID=1

欲了解更多信息,您可以访问this

【讨论】:

    【解决方案3】:

    ('5688','5689') 是一个值数组。

    定义String param = "'5688','5689'"; 并将其用作(@param) 使('5688','5689') 成为一个字符串。哪个行不通。

    【讨论】:

      【解决方案4】:

      Bibhas 是正确的。对我来说这很有效:

      string param="'1234','4567'"; 我们不能使用 param 作为 SQL Parameter(@param)。

      command = new SqlCommand("SELECT * FROM table WHERE number IN (" + param + ")", connection);

      command.ExcecuteReader();

      【讨论】:

      • 您将值直接附加到 SQL 中,但我们尝试通过参数传递值。在我看来,您的 SQL 可以注入。
      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 2011-06-11
      • 2020-04-23
      • 2011-04-02
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      相关资源
      最近更新 更多