sql >> データベース >  >> RDS >> Sqlserver

ストアドプロシージャを使用してSQLに複数の行を挿入する方法は?

    SQL Server 2008 以降では、1 つのステートメントに複数の行を挿入する簡単な方法があります。たとえば、次の構文は有効です:

    INSERT dbo.table(col1, col2) VALUES
        (1, 2),
        (2, 3),
        (3, 4);
    

    上記は3行を挿入します。古いバージョンでは、次のような少し冗長なことを行うことができます:

    INSERT dbo.table(col1, col2)
     SELECT 1, 2
      UNION ALL SELECT 2, 3
      UNION ALL SELECT 3, 4;
    

    もちろん、あなたの ExecuteNonQuery 単一のコマンドである必要はありません。これを単一の文字列として渡すことができ、それでも機能します:

    INSERT dbo.table(col1, col2) VALUES(1, 2);
    INSERT dbo.table(col1, col2) VALUES(2, 3);
    INSERT dbo.table(col1, col2) VALUES(3, 4);
    

    ストアド プロシージャでこれを行う場合、たとえば次の文字列を渡すと、複数の値を持つパラメーターの分割を簡単に実行できます:

    1,2;2,3;3,4
    

    ここに投稿したような関数を使用して、これらの値を処理できます:

    分割値ペアと作成テーブルUDF の使用

    したがって、手順は次のようになります。

    CREATE PROCEDURE dbo.AddOrderLineItems
        @LineItems VARCHAR(MAX)
    AS
    BEGIN
        SET NOCOUNT ON;
    
        INSERT dbo.OrderItems(Product, Quantity)
          SELECT Product, Quantity FROM dbo.MultiSplit(@LineItems);
    END
    GO
    

    そして、次の C# に相当するものを使用して呼び出します:

    EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';
    

    または、Alexey が提案するように、テーブル値パラメーターを使用することもできます。簡単な例:

    CREATE TYPE OrderLineItem AS TABLE
    (
      Product INT,
      Quantity INT
    );
    

    その後、プロシージャを作成できます:

    CREATE PROCEDURE dbo.AddOrderLineItems
        @LineItems OrderLineItem READONLY
        -- other parameters
    AS
    BEGIN
        SET NOCOUNT ON;
    
      INSERT dbo.OrderItems(Product, Quantity) 
      SELECT Product, Quantity FROM @LineItems;
    END
    GO
    

    次に、C# コードで同等の TVP を作成します (私はあなたがそうしたい人ではありません。例はこちら ).

    ただし、いくつかの注意点があります。次の質問をご覧ください:

    一般化されたテーブル値パラメーターとして使用する型



    1. Oracle 11g RMANバックアップセットを新しいデータベースサーバーにインポートするにはどうすればよいですか?

    2. PHPを使用してOracleにBLOBとして画像をアップロードする

    3. データテーブルの特定の行を表示するvb.netクエリ[基本]

    4. SQLサーバーは、列名として部分文字列を使用して、別のテーブルに基づいてテーブルにデータを入力します