23

次のような SQL ステートメントがあります。

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

int のカンマ区切りのリストを提供するにはどうすればよいですか。

  • この場合の「合理的」とは、1 から数十の間を意味します。
4

5 に答える 5

13

できません。:ListOfInts(たとえば ) に置き換えるヘルパー関数を作成:I0,:I1,:I2...し、コードに 1 つずつ追加してパラメーターを渡す必要があります。必要な機能は、リストのサポートでDapper.Netによって適切にエミュレートされます。

于 2012-07-16T16:14:35.893 に答える
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

また、次のコードを使用して(たとえば)操作を実行できます。

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

それが役に立てば幸い。

于 2012-07-16T16:13:46.023 に答える
4

使用しているデータベースは指定しませんが、SQL Server 2008+ の場合は、Table Valued Parametersも考慮する必要があります。

あなたの例では、追加された複雑さは価値がないかもしれませんが、他のシナリオでは役に立ちます。

于 2012-07-16T20:18:50.483 に答える
1

これを処理する最善の方法は、リスト内の値を返す選択クエリを記述できるように、データベース内にリストを保持することです。問題は、データがクライアントから発信されたときに、これをどのように行うことができるかということです。ほとんどの場合、このデータはユーザーが一度に 1 レコードずつ手作業で選択します。その場合、ユーザーが値を選択すると、一度に 1 つずつ値のレコードを追加するテーブル (「ショッピング カート」と考えてください) を使用できます。バッチ ジョブに近い場合は、BulkInsert プロセスを使用してレコードを作成することをお勧めします。

于 2012-07-16T16:17:00.273 に答える
0

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,2INその文字列を句のパラメータ値として使用できます

ocmd.Parameters.Add("ListOfInts",concatenatedIds);
于 2012-07-16T16:13:11.927 に答える