首页 > 解决方案 > 使用 Output INTO 子句在表变量中输入多个条目

问题描述

我的用例如下:

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

我知道我们不能有多个插入 usingOUTPUT INTO子句,但是有没有其他方法可以为插入的行形成基于列的数据?

标签: sql-serversql-server-2008

解决方案


您需要尝试以下步骤:

  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   |
+----------+--------+----------+

推荐阅读