将VARBINARY转换为Int或BigInt

时间:2018-06-05 12:08:27

标签: sql-server ssis sql-server-2016

我的问题很简单,我知道很少有旧时数据库设计不如我们现在所认为的那么好。

我的旧表没有主键来执行Delta加载。因此,我尝试使用哈希概念来创建唯一键。作为" HASHBYTES"返回VarBinary,我不能使用VarBinary类型 primay key(不确定)

MSDN上的参考URL: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/94231bb4-ccab-4626-a9fb-325264bb883f/can-varbinary700-column-be-used-as-primary-key?forum=transactsql

因此,我将其转换为INT或BigInt。问题是它既给出了正值也带有正值(由于范围)。

我的问题是: 如何将VARBINARY(100)类型转换为整数或BigInt(+ ve值)并将其设置为我的一个表中的主键?

编辑注意:

我尝试在SSIS查找任务中使用VARBINARY作为Delta加载的主键。我收到了错误:

  

"违反PRIMARY KEY约束' PK__DMIN__607056C02FB7E7DE'。无法在对象' dbo.DMIN _'中插入重复键。重复键值为(0x00001195764c40525bcaf6baa922091696cd8886)。"。

但是,当我从表中检查重复键时。表没有重复键。那么为什么会出现这个错误?

请注意,第一次SSIS执行工作正常。但是,它在第​​二次执行期间显示错误[在" 查找匹配输出期间"]。

请帮忙。感谢。

1 个答案:

答案 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列,以便您拥有该引用并将该值插入其中。如果这是有道理的。