SQL Server 2008 - HashBytes计算列

18

我正在使用SQL Server 2008。

我有一个称为Title的NVARCHAR(MAX)列,我想为其添加一个唯一索引。 因为该列大于900字节,我决定创建一个HashBytes计算列(基于StackOverflow上的建议)。

如何创建HashBytes列?

alter table Softs add TitleHash AS (hashbytes('SHA1',[Title])) PERSISTED;

这个命令可以工作并创建了一个计算列。

但是,在尝试添加索引时,我遇到了以下错误:

Adding the selected columns will result in an index key with a maximum length of 8000 bytes.  
The maximum permissible index length is 900 bytes. 
INSERT and UPDATE operations fail if the combined value of the key columns exceeds 900 bytes.  
Do you want to continue?

这是用于创建索引的查询:

CREATE NONCLUSTERED INDEX [UIX_TitleHash] ON [dbo].[Softs] 
(
    [TitleHash] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

1
发布索引创建语句。 - Denis Valeev
@denis:是的,没错 - 那样可以 - 但他不能将其作为索引定义本身的列(不是包含的字段)- 这就是我想说的。 - marc_s
@marc_s:是的,我看到了,但我该如何修复它呢 :)? - RuSh
@Denis:我应该在哪里转换结果?在索引本身吗? - RuSh
不,在持久列定义中。alter table Softs alter column... - Denis Valeev
显示剩余3条评论
1个回答

37

如果不特别指定,hashbytes列将创建为 VARBINARY(MAX) 类型,除非你明确告诉它只使用20个字节:

alter table dbo.Softs 
  add TitleHash AS CAST(hashbytes('SHA1', [Title]) AS VARBINARY(20)) PERSISTED

完成这一步后,您可以在该列上创建索引(唯一或非唯一):

CREATE UNIQUE NONCLUSTERED INDEX [UIX_TitleHash] 
  ON [dbo].[Softs]([TitleHash] ASC)

现在这应该可以正常工作了。


1
好问题和好答案。今天我也学到了不要将数据类型转换为bigint。 - Denis Valeev
3
好问题。但我们过去曾因在SET选项要求方面没有太注意而受过伤。http://msdn.microsoft.com/en-us/library/ms189292.aspx是官方文档,请仔细注意名为“ SET选项要求”的部分。 - Michael J Swart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接