【发布时间】:2017-02-09 19:42:44
【问题描述】:
我有一个基于 SHA1 hasbyte 计算列的临时变量。当我在计算列上创建一个 UNIQUE 非聚集索引时,它会抛出警告::
警告!最大密钥长度为 900 字节。索引“UQ__#B445E45__954B055AC5951B75”的最大长度为 8009 字节。对于某些较大值的组合,插入/更新操作将失败。
我记得读出的 SHA1 字节被限制为大约 160 个字节。我无法理解为什么会收到此警告。
如果通过以下查询检查计算列中涉及的所有列的最大长度,则它加起来约为 8148 个字节。但我认为使用我使用的哈希值,计算列的大小应该不超过 160 个字节。
SELECT Sum(c.max_length)
FROM SYS.COLUMNS C INNER JOIN SYS.TABLES tb ON tb.[object_id] = C. [object_id]
INNER JOIN SYS.TYPES T ON C.system_type_id = T.user_type_id
WHERE tb.[is_ms_shipped] = 0
and OBJECT_NAME(tb.object_id)='xyz'
请告知我在这里缺少什么。
【问题讨论】:
-
向我们展示您的计算列?
-
@JuanCarlosOropeza 我的计算列如下所示: CompSum AS HashBytes('SHA1', Col1+ Col2+ Col3+.. 15 more column) 。计算列中包含的所有列都是 varchar(n) 其中 n 不超过 50
-
是的,但 db 不知道。你需要包括一个演员,否则他会假设最大的
n允许 -
@JuanCarlosOropeza 你的意思是说,我添加的唯一约束不会理解哈希字节不会超过 160 个字节,我需要添加计算列的 CAST 上限,以便约束不会显示警告?
-
这只是一个警告。如果您知道输出不能超过 900 字节,则忽略警告。
标签: sql sql-server tsql database-administration