[英]SQL Server : splitting a row into multiple rows from OUTPUT clause
我正在嘗試獲取可以幫助我實現類似於下圖的查詢:
第一個表是 SQL OUTPUT
子句(插入和刪除)的結果。 我想將這些結果拆分到一個新表中(如上圖中的第二個)。 所以我想要一行描述插入的記錄,第二行描述已刪除的記錄。
這是我的示例數據的創建方式:
select
inserted_ID = 1,
inserted_name = 'Brian',
inserted_phone = '123-456-7890',
operation_type1 = 'inserted',
deleted_id = 2,
deleted_name = 'James',
deleted_phone = '222-222-2222',
operation_type2 = 'Deleted'
into
#tbltest
嘗試組織您的表結構,例如(注意 [uid]):
create table [my_table]
(
[id] int
,[name] nvarchar(256)
,[phone] nvarchar(256)
);
insert into [my_table]
values (1, 'Brian', '123-456-7890');
create table [my_log]
(
[inserted_id] int
,[inserted_name] nvarchar(256)
,[inserted_phone] nvarchar(256)
,[deleted_id] int
,[deleted_name] nvarchar(256)
,[deleted_phone] nvarchar(256)
,[uid] uniqueidentifier primary key
);
然后這解決了你的問題:
update [my_table]
set [id] = 2
,[name] = 'James'
,[phone] = '222-222-2222'
output
[deleted].[id]
,[deleted].[name]
,[deleted].[phone]
,[inserted].[id]
,[inserted].[name]
,[inserted].[phone]
,newid()
into [my_log]
(
[inserted_id]
,[inserted_name]
,[inserted_phone]
,[deleted_id]
,[deleted_name]
,[deleted_phone]
,[uid]
);
select
[id] = [id]
,[name] = [name]
,[phone] = [phone]
,[op_type] = CASE [op_type] WHEN 0 THEN 'Insert' ELSE 'Delete' END
from
(
select
[id] = [inserted_id]
,[name] = [inserted_name]
,[phone] = [inserted_phone]
,[op_type] = 0 -- insert
,[uid] = [uid]
from
[my_log]
union
select
[id] = [deleted_id]
,[name] = [deleted_name]
,[phone] = [deleted_phone]
,[op_type] = 1 -- delete
,[uid] = [uid]
from
[my_log]
) as [l]
order by
[l].[uid]
,[l].[op_type] ASC;
除非使用MERGE
語句,否則不能在同一個 DML 操作中同時使用INSERT
和DELETE
。 唯一一次(在MERGE
之外)在inserted
和deleted
偽表中都有行是在UPDATE
操作期間,在這種情況下,兩者中的行將引用表中相同的實際行,只是在這些行的視圖之前和之后。 意思是,您不會看到與問題中顯示的值一樣的值,其中Inserted_ID
和Deleted_ID
不同。
如果您使用的是MERGE
,那么您應該已經擁有所需格式的行,因為OUTPUT
子句中的一行不會代表多行受到影響。 意思是: OUTPUT
已經在你想要的情況下工作,而不是你說的那樣。
嘗試使用 OUTER / CROSS APPLY 運算符:
select ...
from #Output / @Output as o
cross apply (
select o.insertedColA, o.insertedColB, 'I'
-- where o.insertedID is not null
union all
select o.deletedColB, ..., 'D'
-- where o.deletedID is not null
) as x(ColA, ColB, RowType)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.