2017-02-09 226 views
2

我有一个基于SHA1 hasbyte的计算列的临时变量。当我在计算列上创建一个UNIQUE非聚簇索引时,它会引发警告::警告!最大密钥长度是900字节。该索引的最大长度为8009字节

警告!最大密钥长度是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' 

请告知我在这里失踪。

+0

向我们显示您的计算列? –

+0

@JuanCarlosOropeza我的计算列看起来像:CompSum AS HashBytes('SHA1',Col1 + Col2 + Col3 + .. 15更多栏)。计算列中包含的所有列都是varchar(n),其中n不超过50 – Ramya

+0

是的,但db不知道。你需要包括一个转换,否则他会假设允许最大'n' –

回答

2

我不是专家哈希:

但我建议你创建一个列combine varchar(750)(15 * 50)

然后用SET combine = Col1+ Col2+ Col3+.. Col15

更新列并尝试:

CompSum AS HashBytes('SHA1', combine) 

这样你使用的字段永远不会大于750

+0

实际上'varbinary(20)'可能是更好的选择(尝试一下,你会明白为什么)。但我可能会做'CompSum AS CONVERT(varbinary(20),HashBytes('SHA1',col1 + col2 + ...)',而不是添加一个额外的计算列 –

+0

@AaronBertrand是的,工作得更好。建议测试是否可以解决警告。 –

+0

@AaronBertrand只是一个简单的CONVERT消除了警告! – Ramya

相关问题