从尚未预置记录的临时表中插入记录失败

时间:2018-07-25 13:37:06

标签: sql-server sql-server-2014

我试图从临时表插入到常规表中,但是由于临时表中的数据共享与要插入的表的主键相同的值,因此它失败,并违反了主键约束。这是预料之中的,因此我将通过仅插入要插入的表中不存在主键的行来解决此问题。

我尝试了EXISTS和 NOT IN 方法,我检查了展示这两种方法的示例,确认它们总体上都可以在SQL Server 2014中使用,但仍然出现以下错误:

  

违反PRIMARY KEY约束'PK_dbo.InsuranceObjects'。不能   在对象'dbo.InsuranceObjects'中插入重复键。重复的   键值为(3835fd7c-53b7-4127-b013-59323ea35375)。

这是我尝试过的 NOT IN 方差中的SQL:

print 'insert into InsuranceObjects'
INSERT INTO $(destinDB).InsuranceObjects
        (
        Id, Value, DefInsuranceObjectId 
        )
SELECT Id, InsuranceObjectsValue, DefInsuranceObjectId
FROM #vehicle v
WHERE v.Id NOT IN (SELECT Id FROM $(destinDB).InsuranceObjects) -- prevent error when running scrypt multiple times over
GO

如果不明显:

  • Id是有问题的主键。
  • $(destinDB)是命令行变量。与TSQL变量不同。 它使我可以方便地定义目标数据库和实例 基于脚本的级别,甚至多个基于脚本的级别。它用于 整个代码中有多种变体,到目前为止已经执行了 完美。唯一的缺点是您必须以CMD模式运行。
  • 在创建所有临时表时,还使用USE $(某些数据库),因此 这不是问题

我肯定错过了一些显而易见的东西,但是让我发疯的是,如此简单的查询失败了。更糟糕的是,当我尝试运行不带插入部分的select时,尽管我已确认where子句中的 NOT IN 部分失败,但它会返回临时表中的所有记录。

1 个答案:

答案 0 :(得分:3)

我怀疑问题是您的临时表中有重复的ID值。请检查此处的值,因为这会引起您所看到的问题。