SQL Server 2008 - HashBytes计算列

RuS*_*uSh 17 .net sql sql-server sql-server-2008

我正在使用SQL Server 2008.

我有一个名为TitleNVARCHAR(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?
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 33

hashbytes列创建为a,VARBINARY(MAX)除非你明确告诉它20个字节是充足的:

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

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

CREATE UNIQUE NONCLUSTERED INDEX [UIX_TitleHash] 
  ON [dbo].[Softs]([TitleHash] ASC)
Run Code Online (Sandbox Code Playgroud)

现在这应该工作得很好.

  • 好问题.但是我们过去已经被烧了,因为我们之前从未过多地关注SET选项要求.http://msdn.microsoft.com/en-us/library/ms189292.aspx是官方文档,并仔细注意"SET选项要求"一节 (2认同)