2016-10-18 2 views
0

Я пытаюсь следующегоSQL Server: Вставить партия с выходом статьей

  1. Вставить число записей в таблицу A с параметром табличного (TVP). Это TVP имеет дополнительный столбец (ы), которые не являются в A
  2. Получить вставленные идентификаторы из A и соответствующие дополнительные столбцы в в TVP и добавить их в другую таблицу B

Вот что я пытался

Тип:

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] 
); 

Вставка:

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., который я предполагаю, что, как ожидается, потому что столбцы из других таблиц не принимаются INSERT заявления (https://msdn.microsoft.com/en-au/library/ms177564.aspx).

from_table_name столбец префикс, который указывает таблицу, включенную в ЕКОМ в DELETE, UPDATE или MERGE заявление, которое используется для определения строк для обновления или удаления.

Так есть ли другой способ достичь этого?

ответ

1

Вы не можете выбрать значение из таблицы источников, используя INTO оператор. Используйте команду OUTPUT в команде MERGE для таких случаев.

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