2016-10-18 11 views
0

と挿入バッチIは、テーブル値パラメータ(TVP)を使用してテーブルにレコードA次のSQL Serverの:出力句

  1. 挿入数をしようとしています。このTVPは、TVPでAから挿入IDと対応する余分な列を取得し、別のテーブルここB

にそれらを追加することは、私が試したものだA

  • にない余分な列(複数可)を持ってい

    タイプ:

    CREATE TYPE tvp AS TABLE 
    (
        id int, 
        otherid int, 
        name nvarchar(50), 
        age int 
    ); 
    

    テーブル:

    CREATE TABLE A (
        [id_A] [int] IDENTITY(1,1) NOT NULL, 
        [name] [varchar](50), 
        [age] [int] 
    ); 
    
    CREATE TABLE B (
        [id_B] [int] IDENTITY(1,1) NOT NULL, 
        [id_A] [int], 
        [otherid] [int] 
    ); 
    

    インサート:他のテーブルから列がINSERT声明(https://msdn.microsoft.com/en-au/library/ms177564.aspx)のために受理されていないため、

    DECLARE @a1 AS tvp; 
    DECLARE @a2 AS tvp 
    
    -- create a tvp (dummy data here - will be passed to as a param to an SP) 
    INSERT INTO @a1 (name, age, otherid) VALUES ('yy', 10, 99999), ('bb', 20, 88888); 
    
    INSERT INTO A (name, age) 
    OUTPUT 
        inserted.id_A, 
        inserted.name, 
        inserted.age, 
        a.otherid -- <== isn't accepted here 
    INTO @a2 (id, name, age, otherid) 
    SELECT name, age FROM @a1 a; 
    
    INSERT INTO B (id_A, otherid) SELECT id, otherid FROM @a2 
    

    はしかし、これは私が期待されていると思いThe multi-part identifier "a.otherid" could not be bound.、と失敗します。

    いるfrom_table_name は、表がDELETE、UPDATE、または更新または削除する行を指定するために使用されているMERGE文のFROM句に含まれて指定する列の接頭辞です。

    これを達成する他の方法はありますか?

  • 答えて

    1

    INTO演算子を使用してソーステーブルから値を選択することはできません。 この場合、MERGEコマンドでOUTPUT句を使用してください。

    DECLARE @a1 AS tvp; 
    DECLARE @a2 AS tvp 
    
    INSERT INTO @a1 (name, age, otherid) VALUES ('yy', 10, 99999), ('bb', 20, 88888); 
    
    
    MERGE A a 
    USING @a1 a1 
    ON a1.id =a.[id_A] 
    WHEN NOT MATCHED THEN 
    INSERT (name, age) 
        VALUES (a1.name, a1.age) 
    OUTPUT inserted.id_A, 
         a1.otherId, 
         inserted.name, 
         inserted.age 
        INTO @a2; 
    
    
    INSERT INTO B (id_A, otherid) SELECT id, otherid FROM @a2 
    
    関連する問題