2016-10-18 4 views
0

나는 테이블 반환 매개 변수 (TVP)와 함께 테이블 A에 레코드의 다음SQL 서버 : 출력 절

  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] 
    ); 
    
    ,451,515,

    삽입 :

    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 
    

    그러나, 이것은 다른 테이블에서 열을 INSERT 문 (https://msdn.microsoft.com/en-au/library/ms177564.aspx) 허용되지 않기 때문에 내가 기대 추측하는 The multi-part identifier "a.otherid" could not be bound.와 함께 실패합니다.

    from_table_name 는 DELETE, UPDATE의 FROM 절에 포함 된 테이블을 지정하거나 업데이트하거나 삭제할 행을 지정하는 데 사용됩니다 MERGE 문 열 접두사입니다.

    이렇게하려면 다른 방법이 있습니까?

  • 답변

    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