簡體   English   中英

SQL Server:從OUTPUT子句將一行拆分為多行

[英]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;
  1. 除非使用MERGE語句,否則不能在同一個 DML 操作中同時使用INSERTDELETE 唯一一次(在MERGE之外)在inserteddeleted偽表中都有行是在UPDATE操作期間,在這種情況下,兩者中的行將引用表中相同的實際行,只是在這些行的視圖之前和之后。 意思是,您不會看到與問題中顯示的值一樣的值,其中Inserted_IDDeleted_ID不同。

  2. 如果您使用的是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM