如何为SQL参数提供List <int>?

B. *_*non 18 c# sql winforms

我有一个如下的SQL语句:

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

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

  • 在这种情况下,"合理"是指一到十几个.

Fel*_*ano 12

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


Uma*_*mil 5

我认为唯一可行的解​​决方案是传递逗号分隔值,您可以使用函数将其转换为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
Run Code Online (Sandbox Code Playgroud)

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

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))
Run Code Online (Sandbox Code Playgroud)

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

希望能帮助到你.


Shy*_*yju -1

使用Int 数组上Join的方法。string您可以提及comma 作为分隔符

List<int> ints = new List<int>();
ints.Add(4);
ints.Add(6);
ints.Add(2);

string concatenatedIds= string.Join(",", ints.ToArray());
Run Code Online (Sandbox Code Playgroud)

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

ocmd.Parameters.Add("ListOfInts",concatenatedIds);
Run Code Online (Sandbox Code Playgroud)

  • 虽然这可以很好地添加参数,但它不适用于 SQL 中的“in (@ListOfInts)”子句。参数不是这样工作的。我知道这是一厢情愿的想法,但事实并非如此。 (12认同)