在 table 上进行批量插入之前检查行或 ID 是否已经存在

Check to see if a row or an ID already exist before doing a mass insert on a table

我正在尝试从一个数据库 table 插入另一个数据库,如下所示:

INSERT INTO factoryDB_Development.dbo.engineList
    SELECT * 
    FROM factoryDB_Staging.dbo.engineList 
    WHERE engineID NOT IN (SELECT engineID 
                           FROM factoryDB_Development.dbo.engineList)

但是我收到这个错误:

Cannot insert duplicate key in object 'dbo.engineList'

我假设这是因为该 ID 已经存在于 factoryDB_Development.dbo.engineList

当我在 Microsoft 网站上在线查看时,我看到了这个:

To work around this issue, enable trace flag 8690 to disable the Spool operation

有没有办法在执行插入之前检查行或 ID 是否已经存在?

谢谢!

如果我对您的问题的理解正确,您希望避免在目标 table 中插入记录(如果具有相同 ID 的记录已经存在)。

如果有问题的 ID 列是主键,您可以通过重新创建索引简单地设置 IGNORE_DUP_KEY = ON。

下面是示例。

CREATE TABLE [dbo].[Source](
    [ID] [int] NULL,
    [Name] [varchar](5) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Target](
    [ID] [int] NOT NULL,
    [Name] [varchar](5) NULL,
PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

--input sample values in source
INSERT INTO [Source] VALUES (1, 'A') , (1, 'A') , (2, 'B')

--insert data from source to target
INSERT INTO Target 
SELECT  * FROM Source

DROP TABLE SOURCE
DROP TABLE TARGET