2017-02-09 148 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

相關問題