参数化 SQL IN 子句

新手上路,请多包涵

如何参数化包含具有可变数量参数的 IN 子句的查询,例如这个?

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

在此查询中,参数的数量可以是 1 到 5 之间的任何值。

我不希望为此(或 XML)使用专用的存储过程,但如果有一些特定于 SQL Server 2008 的优雅方式,我对此持开放态度。

原文由 Jeff Atwood 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 522
2 个回答

这是我使用的一种快速而肮脏的技术:

 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 "%...%" 查询未编入索引。
  • 确保您没有任何 | 、空白或空标签,否则这将不起作用

还有其他方法可以实现这一点,有些人可能会认为更清洁,所以请继续阅读。

原文由 Joel Spolsky 发布,翻译遵循 CC BY-SA 3.0 许可协议

步骤1:-

 string[] Ids = new string[] { "3", "6", "14" };
string IdsSP = string.Format("'|{0}|'", string.Join("|", Ids));

第2步:-

 @CurrentShipmentStatusIdArray [nvarchar](255) = NULL

第 3 步:-

 Where @CurrentShipmentStatusIdArray is null or @CurrentShipmentStatusIdArray LIKE '%|' + convert(nvarchar,Shipments.CurrentShipmentStatusId) + '|%'

或者

Where @CurrentShipmentStatusIdArray is null or @CurrentShipmentStatusIdArray LIKE '%|' + Shipments.CurrentShipmentStatusId+ '|%'

原文由 Adel Mourad 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进