我有如下 SQL 语句:
...
const string sql = @"UPDATE PLATYPUS
SET DUCKBILLID = :NEWDUCKBILLID
WHERE PLATYPUSID IN (:ListOfInts)";
...
ocmd.Parameters.Add("ListOfInts", ??WhatNow??);
如何提供逗号分隔的整数列表,它可以是任何(合理*)数量的值
- 在这种情况下,“合理”是指一到几十个。
您不能,您必须创建一些替换:ListOfInts
为(例如)的辅助函数,:I0,:I1,:I2...
并通过在代码中一一添加来传递参数。Dapper.Net在其列表支持中优雅地模拟了您想要的功能。
我认为唯一可能的解决方案是传递逗号分隔的值,您可以使用函数将其转换为 SQL 中的表。这是我正在使用的功能
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+,您可能还需要考虑Table Valued Parameters。
对于您的示例,增加的复杂性可能不值得,但它们在其他场景中可能很有用。
处理此问题的最佳方法是将列表保存在数据库中,这样您就可以编写一个选择查询来返回列表中的值。问题是,当数据来自客户端时,你怎么能做到这一点?大多数情况下,这些数据是由用户亲自挑选的,一次一条记录。在这种情况下,您可以使用一个表格(想想:“购物车”),在用户选择它们时,一次添加一个值的记录。如果它更像是一个批处理作业,您可能希望使用 BulkInsert 进程来创建记录。
在 Ints 数组上使用 的Join
方法。string
您可以提及comma
作为分隔符
List<int> ints = new List<int>();
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);