如何为SQL参数提供List ?

我有一个类似如下的SQL语句:

... const string sql = @"UPDATE PLATYPUS SET DUCKBILLID = :NEWDUCKBILLID WHERE PLATYPUSID IN (:ListOfInts)"; ... ocmd.Parameters.Add("ListOfInts", ??WhatNow??); 

如何提供逗号分隔的整数列表,可以是任何(合理的*)数量的值

  • 在这种情况下,“合理”是指一到十几个。

更新 :正如Lasse指出的那样,使用下面的方法无法实现Clay正在尝试做的事情。 虽然这确实传递了一个逗号分隔的数字列表,但它不会按预期执行。 不幸的是我不能删除它,因为它是公认的答案。


尝试这样的事情:

 ocmd.Parameters.Add("ListOfInts", String.Join(",",myList.ToArray()); 

String.Join方法获取数组中的所有元素,并将指定的字符放在它们之间。

你不能,你必须创建一些替换的帮助函数:ListOfInts with(例如) :I0,:I1,:I2...并通过在代码中逐个添加来传递参数。 您想要的function由Dapper.Net在其列表支持中优雅地模拟。

我认为唯一可行的解​​决方案是传递逗号分隔值,您可以使用函数将其转换为SQL中的表。 这是我正在使用的function

 CREATE FUNCTION dbo.CSVToList (@CSV varchar(3000)) RETURNS @Result TABLE (Value varchar(30)) AS BEGIN DECLARE @List TABLE ( Value varchar(30) ) DECLARE @Value varchar(30), @Pos int SET @CSV = LTRIM(RTRIM(@CSV))+ ',' SET @Pos = CHARINDEX(',', @CSV, 1) IF REPLACE(@CSV, ',', '') <> '' BEGIN WHILE @Pos > 0 BEGIN SET @Value = LTRIM(RTRIM(LEFT(@CSV, @Pos - 1))) IF @Value <> '' INSERT INTO @List (Value) VALUES (@Value) SET @CSV = RIGHT(@CSV, LEN(@CSV) - @Pos) SET @Pos = CHARINDEX(',', @CSV, 1) END END INSERT @Result SELECT Value FROM @List RETURN END 

并且您可以使用以下代码(例如)来执行操作:

 DECLARE @CSV varchar(100) SET @CSV = '30,32,34,36,40' SELECT ProductID, ProductName, UnitPrice FROM Products WHERE ProductID IN (SELECT * FROM dbo.CSVToLIst(@CSV)) 

我从这里获取代码: http : //www.geekzilla.co.uk/view5C09B52C-4600-4B66-9DD7-DCE840D64CBD.htm

希望能帮助到你。

您没有说明您正在使用哪个数据库,但如果它是SQL Server 2008+,您可能还需要考虑表值参数 。

对于您的示例,增加的复杂性可能不值得,但它们在其他方案中可能很有用。

在Ints数组上使用stringJoin方法。 你可以提到comma作为分隔符

 List ints = new List(); ints.Add(4); ints.Add(6); ints.Add(2); string concatenatedIds= string.Join(",", ints.ToArray()); 

输出( concatenatedIds值)将为4,6,2 。 您可以使用该字符串作为IN子句的参数值

 ocmd.Parameters.Add("ListOfInts",concatenatedIds); 

处理此问题的最佳方法是将列表保留在数据库中,以便您可以编写选择查询以返回列表中的值。 问题是,当数据来自客户端时,如何做到这一点? 大多数情况下,这些数据是由用户亲自挑选的,一次一条记录。 在这种情况下,您可以使用一个表(想想:“购物车”),在用户选择它们时,一次添加一个值的记录。 如果它更像是批处理作业,您可能希望使用BulkInsert过程来创建记录。