简体   繁体   English

使用** DELETE FROM…OUTPUT…INTO **时,获取目标表的标识

[英]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.IDID列则是ArchiveTableIdentity列。 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: 我发现在SPINSERT...EXEC...中将DMLOUTPUT一起使用时发现了一个有趣的变化:

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.

相关问题 FORALL插入目标表,然后从源表中删除FORALL - FORALL insert destination table then a FORALL delete from source table 在输出中使用SCOPE_IDENTITY()时的一致性 - Consistency when using SCOPE_IDENTITY() in output SSIS删除和重新创建目标表 - SSIS Delete and Recreate Destination Table 当数据或列当前不在目标表中时,如何将源表中的列添加到目标表中 - How to add a column from source table into destination table when the data or column is currently not in the destination table 如何在将DELETE FROM与OUTPUT结合使用时指定ORDER BY? - How to specify ORDER BY when using DELETE FROM in combination with OUTPUT? Oracle 是否允许 SQL INSERT INTO 如果目标表具有 GENERATE ID ALWAYS AS - Does Oracle allow an SQL INSERT INTO using a SELECT statement for VALUES if the destination table has an GENERATE ALWAYS AS IDENTITY COLUMN 雪花多表插入使用何时和子查询不在目标表中的值 - Snowflake multiple table inserts using when and subqueries for values not in the destination table 使用SQL OUTPUT将INSERT插入具有Identity(或默认值)的表中 - Using SQL OUTPUT for INSERT into a table with Identity (or default values) SQL SCOPE_IDENTITY或OUTPUT与来自另一个表的数据 - SQL SCOPE_IDENTITY or OUTPUT with data from another table 使用输出捕获自动增量标识以及过去的标识映射表 - Using output to capture auto increment identity, plus past identity mapping table
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM