2012-07-11 40 views
0

你好我有一個看起來像這樣的SQL表:SQL複製行發生

ID  BEZEICHNUNG PREIS  UPDATE_DATE   FLAG 

1  Drake  Room   14.06.2012 16:00  0 
2  Blazer  BS   12.05.2012 14:45  0 

當我改變的值,我想排一個新的ID複印和改旗1 它應該是這樣的:

ID  BEZEICHNUNG PREIS  UPDATE_DATE   FLAG 

1  Drake  Room   11.07.2012 09:40  1 
2  Blazer  BS   12.05.2012 14:45  0 
3  Dune   Room   11.07.2012 09:40  0 

當我改變該行的UPDATE_DATE更新自己,一個標誌設置爲1。 如何創建這樣的SQL語句。

當前觸發這個樣子的:

ALTER TRIGGER [dbo].[UPDT_DIENSTLEISTUNG] 
    ON [dbo].[DIENSTLEISTUNG] 
    AFTER INSERT, UPDATE 
AS 
BEGIN 

    SET NOCOUNT ON; 

    UPDATE DIENSTLEISTUNG 
     SET UPDATE_DATE = getdate() 
    WHERE id IN (SELECT id 
        FROM inserted); 


END; 

在此先感謝您的幫助

+1

您的sql – Rab 2012-07-11 07:44:14

+0

它是服務器上的MS SQL Server 2008 – 2012-07-11 07:45:33

+0

我還沒有sql語句。 – 2012-07-11 07:46:36

回答

2

請先創建該觸發器,然後嘗試更新表

CREATE TRIGGER [dbo].[UPDT_DIENSTLEISTUNG] 
    ON [dbo].[DIENSTLEISTUNG] 
    AFTER UPDATE 
AS 

BEGIN 
SET NOCOUNT ON; 

DECLARE @MAX_ID INT; 
SELECT @MAX_ID=MAX(ID) FROM DIENSTLEISTUNG; 

declare @tmp Table(ID int,  BEZEICHNUNG varchar(20), PREIS varchar(20), 
    UPDATE_DATE datetime,  FLAG bit) 

insert into @tmp 
select ID,BEZEICHNUNG,PREIS,UPDATE_DATE,1 [flag] from deleted; 

delete T from DIENSTLEISTUNG T JOIN @tmp I 
ON T.ID=I.ID 

INSERT INTO DIENSTLEISTUNG 
SELECT @MAX_ID+ROW_NUMBER() OVER(ORDER BY ID) [ID],BEZEICHNUNG,PREIS,GETDATE(),0 
FROM INSERTED 

INSERT INTO DIENSTLEISTUNG 
select * from @tmp 


SET NOCOUNT OFF; 
END; 
+0

謝謝你我會試試這個 – 2012-07-11 09:18:02

+0

對於多行更新,它將生成具有相同「ID」值的多行(所有新插入的行將使用相同的@ max_id + 1 '價值) – 2012-07-11 12:12:32

+0

@Damien_The_Unbeliever:感謝您指出,我已更新我的查詢 – 2012-07-11 12:21:58

-1

一個選擇這樣做(原行被更新,但歷史行插入)是使用SQL相似爲此:

create table MyTab 
(
    [id] int primary key identity, 
    [name] varchar(50), 
    [type] varchar(50), 
    [flag] bit default 0 
) 

insert into MyTab([name], [type]) 
    Values('Drake', 'Room') 
insert into MyTab([name], [type]) 
    Values('Blazer', 'BS') 

select * from myTab 

Update MyTab 
    Set name = name + 'new' 
Output deleted.name, deleted.type, 1 
into myTab(name, type, flag) 
Where name = 'Drake' 

select * from myTab