发生更改后使用新ID复制SQL行
您好,我有一个SQL表,如下所示:发生更改后使用新ID复制SQL行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,您好,我有一个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 BEZEICHNUNG PREIS UPDATE_DATE F
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 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
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;
当我更改一个值时,我想用一个新id复制该行,并将标志更改为1
应该是这样的:
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 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
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语句
当前触发器如下所示:
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 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
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;
提前感谢您的帮助一个选项(更新原始行,但插入历史记录行)是使用类似以下内容的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
请先创建此触发器,然后尝试更新表
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;
这是服务器上的MS SQL Server 2008。我还没有SQL语句。那么您如何更新更新时间戳列?抱歉,我会查看它。我将发布sql语句如果随后对
ID
3进行了更新,那么此时是否将ID
1行单独保留?如果是这样,您以后如何将ID
1行与任何内容关联起来(其所有列值都与ID
3处的行不同)?如果是,我能看到的两行之间唯一可以匹配的列是update\u timestamp
——那么如果同时更新了多行呢?对于多行更新,将生成具有相同ID
值的多行(所有新插入的行将使用相同的@max\u ID+1
值)@Damien_不信者:谢谢你指出,我已经更新了我的queryhello joe。我尝试了你的解决方案,但缺少一些东西。我更新了我的帖子。请你再看一遍好吗?