2014-07-23 14 views
0

我可以使用OUTPUT在對錶進行更新時生成行前值和行後值。我可以將這些值放入表格中。我可以使用Update命令中的output子句生成2行

但是他們以單排進入表格。

我需要將前面的值作爲一行,將後面的值作爲新行。

所以這段代碼目前不適合我,但它顯示了我正在嘗試做的事情。有沒有辦法使用OUTPUT來做到這一點。

update dbo.table1 
set employee = employee + '_updated' 
OUTPUT 'd',DELETED.* INTO dbo.table2, 
OUTPUT 'i',INSERTED.* INTO dbo.table2, 
WHERE id = 4 OR id = 2; 

這個片段下方的作品,但只創建一個單行:

update dbo.table1 
set employee = employee + '_updated' 
OUTPUT 'd', DELETED.*, 'i', INSERTED.* INTO dbo.table2, 
WHERE id = 4 OR id = 2; 

我可以使用觸發器做到這一點,但不是在這種情況下允許的。

我可以做手工(選擇什麼,我要更新到表2,然後做更新...)

任何提示或提示讚賞如何只使用只輸出在做更新?

RGDS,戴夫

+0

我不相信SQL Server在這種語句中支持多輸出子句。 –

+2

你可以輸出到表變量,然後做一個選擇/ UNION轉換成單獨的行,作爲一個單獨的步驟,如果這真的是一個理智的事情要做(幾乎總是,所有的數據是更明智的在單行上,否則你經常需要有效地重建這樣的事情,但必須手動重新關聯插入和刪除的行) –

+0

@GordonLinoff是絕對正確的。超過1個輸出沒有意義。 –

回答

1

爲了詳細說明在註釋中給出一個答案:

declare @TempTable table (
    d_id int, 
    d_employee varchar(50), 
    d_other varchar(50), 
    u_id int, 
    u_employee varchar(50), 
    u_other varchar(50) 
) 

update Table1 
set employee = employee + '_updated' 
output deleted.id d_id, deleted.employee d_employee, deleted.other d_other, 
    inserted.id u_id, inserted.employee u_employee, inserted.other u_other 
    into @TempTable 
where id = 4 or id = 2; 

insert Table2 (change_type, employee_id, employee, other) 
select 
    'd', 
    d_id, 
    d_employee, 
    d_other 
from @TempTable 

union all 

select 
    'i', 
    u_id, 
    u_employee, 
    u_other 
from @TempTable 

我對你們的架構的一些假設,因爲它沒有給出,但是這應該讓你開始。

+0

如果你將已經寫入第二個INSERT的'UNION ALL'替換到列列表的末尾,那就是我的建議。 –

+0

@Damien_The_Unbeliever更新:) – jayEss

+0

非常感謝所有的答案,我會採用這種方法。 – davehants

相關問題