[英]Get Identity of destination table when using **DELETE FROM … OUTPUT … INTO**
I use bellow code to archive old data in ArchiveTable
and delete archived data from SourceTable
我使用下面的代码在
ArchiveTable
存档旧数据,并从SourceTable
删除存档数据
DELETE FROM SourceTable
OUTPUT
DELETED.[ID],
DELETED.[Code],
DELETED.[Title]
INTO ArchiveTable([OldID], [Code], [Title])
WHERE Condition
Structure of tables: 表的结构:
CREATE TABLE [SourceTable](
[ID] [INT] IDENTITY(1,1) NOT NULL,
[Code] [VARCHAR](16) NULL,
[Title] [NVARCHAR](128) NULL,
CONSTRAINT [PK_SourceTable] PRIMARY KEY CLUSTERED ([ID] ASC)
)
GO
CREATE TABLE [ArchiveTable](
[ID] [INT] IDENTITY(1,1) NOT NULL,
[OldID] [INT] NOT NULL,
[Code] [VARCHAR](16) NULL,
[Title] [NVARCHAR](128) NULL,
CONSTRAINT [PK_ArchiveTable] PRIMARY KEY CLUSTERED ([ID] ASC)
)
GO
I need to return deleted records and ArchiveTable.[ID]
to application. 我需要将删除的记录和
ArchiveTable.[ID]
给应用程序。 I change the code like this: 我这样更改代码:
DELETE FROM SourceTable
OUTPUT
DELETED.[ID],
DELETED.[Code],
DELETED.[Title]
INTO ArchiveTable([OldID], [Code], [Title])
OUTPUT DELETED.*
WHERE Condition
This code return deleted records but I don't know how to get ID of ArchiveTable
for this records. 此代码返回已删除的记录,但我不知道如何获取该记录的
ArchiveTable
ID。 Look at ArchiveTable
structure, It has OldID
column that refer to SourceTable.ID
and ID
column that it is an Identity
column of ArchiveTable
. 看
ArchiveTable
结构,它有OldID
列引用SourceTable.ID
而ID
列则是ArchiveTable
的Identity
列。 I need to ArchiveTable.ID
in final result. 我需要在最终结果中使用
ArchiveTable.ID
。
You can use a temporary table 您可以使用临时表
CREATE TABLE #DeletedRows(
[ID] [INT] NOT NULL,
[Code] [VARCHAR](16) NULL,
[Title] [NVARCHAR](128) NULL
)
DELETE SourceTable
OUTPUT
DELETED.[ID],
DELETED.[Code],
DELETED.[Title]
INTO #DeletedRows([ID], [Code], [Title])
WHERE Condition
INSERT ArchiveTable([OldID], [Code], [Title])
OUTPUT INSERTED.*
SELECT [ID], [Code], [Title]
FROM #DeletedRows
DROP TABLE #DeletedRows
A variant with a table variable 具有表变量的变体
DECLARE @DeletedRows TABLE(
[ID] [INT] NOT NULL,
[Code] [VARCHAR](16) NULL,
[Title] [NVARCHAR](128) NULL
)
DELETE SourceTable
OUTPUT
DELETED.[ID],
DELETED.[Code],
DELETED.[Title]
INTO @DeletedRows([ID], [Code], [Title])
WHERE Condition
INSERT ArchiveTable([OldID], [Code], [Title])
OUTPUT INSERTED.*
SELECT [ID], [Code], [Title]
FROM @DeletedRows
I found an interesting variant using DML
with OUTPUT
in SP
and INSERT...EXEC...
after that: 我发现在
SP
和INSERT...EXEC...
中将DML
与OUTPUT
一起使用时发现了一个有趣的变化:
Test tables: 测试表:
CREATE TABLE TestTable(
ID int NOT NULL PRIMARY KEY,
Title varchar(10) NOT NULL
)
CREATE TABLE TestTableLog(
LogID int NOT NULL IDENTITY,
OperType char(1) NOT NULL,
CHECK(OperType IN('I','U','D')),
ID int NOT NULL,
Title varchar(10) NOT NULL
)
DML procedures: DML程序:
CREATE PROC InsTestTable
@ID int,
@Title varchar(10)
AS
INSERT TestTable(ID,Title)
OUTPUT inserted.ID,inserted.Title,'I' OperType
VALUES(@ID,@Title)
GO
CREATE PROC UpdTestTable
@ID int,
@Title varchar(10)
AS
UPDATE TestTable
SET
Title=@Title
OUTPUT inserted.ID,inserted.Title,'U' OperType
WHERE ID=@ID
GO
CREATE PROC DelTestTable
@ID int
AS
DELETE TestTable
OUTPUT deleted.ID,deleted.Title,'D' OperType
WHERE ID=@ID
GO
Tests: 测试:
-- insert test
INSERT TestTableLog(ID,Title,OperType)
EXEC InsTestTable 1,'A'
INSERT TestTableLog(ID,Title,OperType)
EXEC InsTestTable 2,'B'
INSERT TestTableLog(ID,Title,OperType)
EXEC InsTestTable 3,'C'
-- update test
INSERT TestTableLog(ID,Title,OperType)
EXEC UpdTestTable 2,'BBB'
-- delete test
INSERT TestTableLog(ID,Title,OperType)
EXEC DelTestTable 3
GO
-- show resutls
SELECT *
FROM TestTableLog
Maybe it'll be interesting to someone. 也许对某人会很有趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.