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

複数の結果セットを持つexecでINSERTINTO

    この問題の回避策の1つは、OUTPUTを使用することです。 結果セットの代わりにパラメーター(JSON / XML)。

    CREATE TABLE tab1(ID INT, Name NVARCHAR(10), Amount MONEY);
    INSERT INTO tab1(ID, Name, Amount)
    VALUES (1, 'Alexander', 10),(2, 'Jimmy', 100), (6, 'Billy', 20);
    
    CREATE PROCEDURE dbo.pVendorBalance 
    AS
    BEGIN
       -- first resultset
       SELECT * FROM tab1 WHERE ID <=2;
    
       -- second resultset
       SELECT * FROM tab1 WHERE ID > 5;
    END;
    

    OUTパラメータ付きのバージョン:

    CREATE PROCEDURE dbo.pVendorBalance2 
             @resultSet1 NVARCHAR(MAX) OUT,
             @resultSet2 NVARCHAR(MAX) OUT
    AS
    BEGIN
        SELECT @resultSet1 = (SELECT * FROM tab1 WHERE ID <=2 FOR JSON AUTO),
               @resultSet2 = (SELECT * FROM tab1 WHERE ID > 5 FOR JSON AUTO);
    END;
    

    そして最後の電話:

    DECLARE @r1 NVARCHAR(MAX), @r2 NVARCHAR(MAX);
    EXEC dbo.pVendorBalance2 @r1 OUT, @r2 OUT;
    
    
    -- first resultset as table
    SELECT * 
    INTO #t1
    FROM OpenJson(@r1)
    WITH (ID int '$.ID', [Name] NVARCHAR(50) '$.Name',Amount money '$.Amount');
    
    -- second resultset as table
    SELECT *  
    INTO #t2
    FROM OpenJson(@r2)
    WITH (ID int '$.ID', [Name] NVARCHAR(50) '$.Name',Amount money '$.Amount');
    
    SELECT * FROM #t1;
    SELECT * FROM #t2;
    

    DBFiddleデモ

    編集:

    2番目のアプローチは、tSQLt.ResultSetFilter を使用することです。 CLR関数(tSQLtテストフレームワークの一部):



    1. MySQLの既存の列にnull以外の制約を追加する方法

    2. Microsoft Visual Studio 2013のWinFormsでMySql(C#)のEntityFramework6を有効にする

    3. MySQLカバーvsコンポジットvs列インデックス

    4. R12.2でカットオーバーフェーズが失敗した後にパッチをロールバックする方法