是否可以使用查询参数填充IN关键字

Posted

技术标签:

【中文标题】是否可以使用查询参数填充IN关键字【英文标题】:Is it possible to use query parameters to fill the IN keyword 【发布时间】:2009-02-26 10:14:43 【问题描述】:

想象一个以 GUID 作为主键的表。我想根据它们的主键选择其中一些行。我想使用如下查询:

SELECT * FROM mytable WHERE id IN ('firstguidhere','secondguidhere');

我正在使用 ADO.NET 来查询数据库,所以我想使用参数化查询而不是动态 sql,这显然可以工作,但我想保留参数化查询的好处(安全性、转义等)。 ..)。

是否可以使用 sql 参数填充 IN 子句的集合?

【问题讨论】:

这里有一个重复的问题...找到它... ***.com/questions/337704/… @Jon,该问题的公认答案并不是最佳答案,尽管这是我自己多次使用过的一种技巧,对于较小的表和/或不常见的查询来说很好。 @jon,感谢您指出另一个问题。我搜索了,但没有找到那个问题。我考虑使用动态生成参数化查询的第二个答案。我认为这个问题已经结束。有人能做到吗? 【参考方案1】:

您可以将 GUID 列表作为逗号分隔的字符串参数传递,并使用表值 UDF 将它们拆分为一个表以在您的 IN 子句中使用:

SELECT *
FROM my_table
WHERE id IN (SELECT id FROM dbo.SplitCSVToTable(@MyCSVParam))

Erland Sommarskog 有一个interesting article,其中包含如何使用 UDF 将逗号分隔的字符串拆分为表的示例。

(出于性能原因,您应该确保您的 UDF 是内联表值的,而不是多语句。)

【讨论】:

最近用Sommarskog的文章解决了一个类似的问题。非常适合我们的需求。

以上是关于是否可以使用查询参数填充IN关键字的主要内容,如果未能解决你的问题,请参考以下文章

java 中 使用 find_in_set关键字查询mysql,怎么传值?

java 中 使用 find_in_set关键字查询mysql,怎么传值?

mysql-in关键字,分组查询,分页查询

使用EXISTS关键字引入的子查询与IN关键字引入的子查询在语法上都有哪些不同?

在 SQL 语句中将“IN”与子查询一起使用

如何使用 DataView 的 RowFilter 使用关键字“IN”来过滤集合