我的问题很简单,我知道很少有旧时数据库设计不如我们现在所认为的那么好。
我的旧表没有主键来执行Delta加载。因此,我尝试使用哈希概念来创建唯一键。作为" HASHBYTES"返回VarBinary,我不能使用VarBinary类型 primay key(不确定)
因此,我将其转换为INT或BigInt。问题是它既给出了正值也带有正值(由于范围)。
我的问题是: 如何将VARBINARY(100)类型转换为整数或BigInt(+ ve值)并将其设置为我的一个表中的主键?
编辑注意:
我尝试在SSIS查找任务中使用VARBINARY作为Delta加载的主键。我收到了错误:
"违反PRIMARY KEY约束' PK__DMIN__607056C02FB7E7DE'。无法在对象' dbo.DMIN _'中插入重复键。重复键值为(0x00001195764c40525bcaf6baa922091696cd8886)。"。
但是,当我从表中检查重复键时。表没有重复键。那么为什么会出现这个错误?
请注意,第一次SSIS执行工作正常。但是,它在第二次执行期间显示错误[在" 查找匹配输出期间"]。
请帮忙。感谢。
答案 0 :(得分:0)
在我们使用GUID作为主要密钥之前,我使用过的项目,使用SQL Server中的唯一标识符类型。
然而,主要问题是使用uniqueidentifier类型作为聚簇索引会在一段时间后降低数据库的性能,所以最近我们采用了以下方法(基于this article) :
创建列:guid,uniqueidentifier,nonnull,默认值newsequentialid(),PK
创建列:id,bigint,nonnull,identity(1,1)
在guid列上创建一个非聚集索引,唯一的 在id列上创建聚簇索引,唯一
这样,当您插入此新表时,您不必担心密钥或身份。
如果您需要在旧数据库和新数据库之间使用某种形式的引用,并且您可以修改旧数据库的结构,则可以在其中创建uniqueidentifier列(如果它不支持,则可以创建char(36)) uniqueidentifier)并为每个分配一个guid,然后在新数据库中创建一个额外的uniqueidentifier列,以便您拥有该引用并将该值插入其中。如果这是有道理的。