【问题标题】:Convert VARBINARY to Int or BigInt将 VARBINARY 转换为 Int 或 BigInt
【发布时间】:2018-06-05 12:08:26
【问题描述】:

我的问题很简单,我知道过去的数据库设计并不像我们现在所认为的那样好。

我的旧表没有执行增量加载的主键。因此,我正在尝试使用散列概念来创建唯一键。由于“HASHBYTES”返回 VarBinary,我不能将 VarBinary 类型用作 主键(不确定)

MSDN 上的参考网址: 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 作为增量加载的主键。我得到了错误:

“违反 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


【解决方案1】:

在我一直使用 GUID 作为主键之前我参与过的项目中,利用 SQL Server 中的唯一标识符类型。

然而,这样做的主要问题是,使用 uniqueidentifier 类型作为聚集索引可能会在一段时间后降低数据库的性能,因此最近我们采取了以下方法(基于this article)

创建列:guid、uniqueidentifier、nonnull、默认值 newsequentialid()、PK
创建列:id、bigint、nonnull、identity(1,1)

在 guid 列上创建一个非聚集索引,唯一
在 id 列上创建聚集索引,唯一

这样当你插入这个新表时,你就不必担心键或身份了。

如果您需要在旧数据库和新数据库之间进行某种形式的引用,并且您可以修改旧数据库的结构,您可以在其中创建一个 uniqueidentifier 列(如果不支持 uniqueidentifier,则为 char(36))并为其中的每一个分配一个 guid,然后在新数据库中创建一个额外的 uniqueidentifier 列,以便您拥有该引用并将该值插入其中。如果这有意义的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多