【发布时间】:2018-06-05 12:08:26
【问题描述】:
我的问题很简单,我知道过去的数据库设计并不像我们现在所认为的那样好。
我的旧表没有执行增量加载的主键。因此,我正在尝试使用散列概念来创建唯一键。由于“HASHBYTES”返回 VarBinary,我不能将 VarBinary 类型用作 主键(不确定)
因此,我将其转换为 INT 或 BigInt。问题是它给出了负值和正值(由于范围)。
我的问题是: 如何将 VARBINARY(100) 类型转换为整数或 BigInt(+ve 值)并将其设置为我的一个表中的主键?
编辑说明:
我尝试在 SSIS 查找任务中使用 VARBINARY 作为增量加载的主键。我得到了错误:
“违反 PRIMARY KEY 约束 'PK__DMIN__607056C02FB7E7DE'。无法在对象 'dbo.DMIN_' 中插入重复键。重复键值为 (0x00001195764c40525bcaf6baa922091696cd8886)。”。
但是,当我从表中检查重复键时。表没有重复键。那为什么会出现这个错误呢?
请注意,第一次 SSIS 执行工作正常。但是,它在第二次执行期间显示错误 [在“查找匹配输出”期间]。
请帮忙。谢谢。
【问题讨论】:
-
对于
INT,发生冲突的可能性很大——即使是几万行也有很高的发生冲突的可能性。如果您的表有数百万行,即使BIGINT也会很快崩溃。有什么理由不能简单地使用 int/bigint 身份作为主键(如果你必须有一个键),并使用完整哈希值的索引来检查你的行是否存在? -
为什么不能用varbinary(100)作为PK?
-
很可能第二次执行失败,因为您尝试导入的行实际上已经存在。仔细检查您如何使 SSIS 排除已存在的行。 SSIS 有自己的规则来比较不一定与 SQL Server 匹配的值。另请注意,您应该插入 不 与查找输出匹配的行(即 不 存在),因此请确保已将正确的输出连接到右侧输入。
标签: sql-server ssis sql-server-2016