我正试图从临时表插入到常规表中,但由于临时表中的数据与我要插入的表的主键的值相同,所以它失败,违反了主键约束。这是预期的,因此我只插入主键尚未出现在要插入的表中的行来解决这个问题。
我尝试了既存在又
不在
方法,我查看了展示这两种方法的示例,确认了这两种方法在SQL Server 2014中的总体效果,但我仍然收到以下错误:
违反了主键约束“pk_dbo.InsuranceObjects”。不能
在对象“dbo.InsuranceObjects”中插入重复键。复制品
键值为(3835FD7C-53B7-4127-B013-59323EA35375)。
这是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变量。
它允许我方便地定义目标数据库和实例
基于脚本的级别,甚至多个基于脚本的级别。用于
在整个代码中有多个变体,迄今为止已执行
完美。唯一的缺点是必须在命令模式下运行。
-
创建所有临时表时,也使用$(某些数据库),因此
这不是问题
我肯定遗漏了一些非常明显的东西,但是这样一个简单的查询失败让我抓狂。更糟糕的是,当我尝试运行不带insert部分的select时,它会返回temp表中的所有记录,尽管我已确认存在重复项,但这些重复项应使
不在
包含在WHERE子句中。