代码之家  ›  专栏  ›  技术社区  ›  CodeSmith

在尚未预设记录的临时表中插入记录失败

  •  0
  • CodeSmith  · 技术社区  · 6 年前

    我正试图从临时表插入到常规表中,但由于临时表中的数据与我要插入的表的主键的值相同,所以它失败,违反了主键约束。这是预期的,因此我只插入主键尚未出现在要插入的表中的行来解决这个问题。

    我尝试了既存在又 不在 方法,我查看了展示这两种方法的示例,确认了这两种方法在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子句中。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Sean Lange    6 年前

    我怀疑问题是临时表中有重复的ID值。请检查那里的值,因为它会导致您看到的问题。