Несколько записей в табличной переменной с использованием предложения Output INTO - PullRequest
0 голосов
/ 02 апреля 2020

Мой пример использования следующий:

Create table Emp
(
    id int ,
    fname varchar(100),
    lname varchar(100)
)

declare @aud table (prop varchar(1000),[oldval] varchar(100),[toval] varchar(100))

INSERT INTO EMP(id, fname, lname)
OUTPUT 'fname', '', inserted.fname INTO @aud (prop, [oldval], [toval])
VALUES (1,'malcolm','dsouza')


SELECT * FROM @aud

Я хочу, чтобы данные формировались следующим образом:

prop   oldval   toval
------------------------
fname           malcolm
lname           dsouza

Я знаю, что мы не можем иметь несколько вставок, используя предложение OUTPUT INTO , но есть ли другой способ, которым я могу сформировать данные для вставленных строк на основе столбцов?

1 Ответ

0 голосов
/ 02 апреля 2020

Вам необходимо выполнить следующие шаги:

  1. Предложение OUTPUT просто вставляет строки в табличную переменную, т. Е. Отображение строки в одну строку. Вам необходимо соответствующим образом изменить определение таблицы.

  2. Теперь вы можете использовать CROSS APPLY, чтобы получить желаемый результат.

**TEST SETUP**
Create table  #Emp(
id int ,
fname  varchar(100),
lname varchar(100)
)

ТЕСТ

declare @aud table(oldfname varchar(100),fname varchar(100),oldlname varchar(100), lname varchar(100));

INSERT INTO #EMP(id,fname,lname)
OUTPUT '' as oldfname,inserted.fname, '' as oldlname, inserted.lname INTO @aud
values (1,'malcolm','dsouza');

SELECT property, oldval, newval as oldValue  
FROM @aud
CROSS APPLY 
( values('fname',oldfname,fname),('lname',oldlname, lname)) as t(property,oldVal, newVal)

Результирующий набор

+----------+--------+----------+
| property | oldval | oldValue |
+----------+--------+----------+
| fname    |        | malcolm  |
| lname    |        | dsouza   |
+----------+--------+----------+
...