如何参数化一个包含IN子句的查询,该子句的参数数量是可变的,比如这个?

SELECT * FROM Tags 
WHERE Name IN ('ruby','rails','scruffy','rubyonrails')
ORDER BY Count DESC

在这个查询中,参数的数量可以是1到5.

我不希望为此(或XML)使用专用存储过程,但如果有特定于SQL Server 2008的优雅方式,我愿意这样做.

推荐答案

下面是我使用过的一种快速而肮脏的技巧:

SELECT * FROM Tags
WHERE '|ruby|rails|scruffy|rubyonrails|'
LIKE '%|' + Name + '|%'

下面是C代码:

string[] tags = new string[] { "ruby", "rails", "scruffy", "rubyonrails" };
const string cmdText = "select * from tags where '|' + @tags + '|' like '%|' + Name + '|%'";

using (SqlCommand cmd = new SqlCommand(cmdText)) {
   cmd.Parameters.AddWithValue("@tags", string.Join("|", tags);
}

两个警告:

  • 表演糟透了.LIKE "%...%"个查询没有索引.
  • 确保你没有任何|、空白或空标签,否则这将不起作用

还有其他方法可以做到这一点,有些人可能认为更干净,所以请继续阅读.

Sql相关问答推荐

limit 1是否提高了唯一值列查询的性能

从snowflake中的表格中删除一个完全重复的副本

如何使用LinkHouse群组ArrayInsertAt以零作为位置参数

提取Snowflake SQL中的嵌套键

基于模式或其他行集的数据复制

SQL查询以条件空值跟踪生产操作结果进展

PostgreSQL:如果发现多行具有相似列值,则跳过 Select 行

SQL查询:合并2个表

为表中每个缺少的引用创建新行

如何根据计数和分组获取订单总数

如何根据给定条件PostgreSQL迭代减少组中的行数

按分类标准检索记录

在SQL Server中设置关联对象的有效JSON格式

在SELECT中将日期格式转换为双周时段

提取连续时间戳范围的SQL

使用多个WITH子查询的替代方法

根据潜在空值的条件对记录进行计数

以 15 分钟为间隔的使用情况SQL 查询

如何使用 pg-promise 创建要在复杂的 sql 查询中使用的 VALUES 列表?

PostgreSQL 中的递归树查询