【问题标题】:SQL Server 2008 - HashBytes computed columnSQL Server 2008 - HashBytes 计算列
【发布时间】:2011-04-11 10:09:38
【问题描述】:

我使用的是 SQL Server 2008。

我有一个名为 Title 的 NVARCHAR(MAX) 列,我想为它添加一个唯一索引。 因为该列大于 900bytes ,所以我决定创建一个 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

【问题讨论】:

  • 发布索引创建语句。
  • @marc_s 他实际上可以在included columns 列表中include 它。
  • @denis: 是的,是的 - 这会起作用 - 但他不能将其作为索引定义本身的列(不是包含的字段) - 这就是我的意思
  • 将创建索引查询添加到问题中。我正在尝试在 TitleHash 列上创建索引。
  • 我猜 hashbytes 语句会生成 varbinary(max) 数据类型,所以你需要将结果转换为 varbinary(20) for sha1。

标签: .net sql sql-server sql-server-2008


【解决方案1】:

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)

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

【讨论】:

  • 好问题和好答案。而且我今天学会了不要自己转换为 bigint。
  • 好问题。但是我们过去被烧毁了,因为我们以前从未过多关注 SET 选项要求。 msdn.microsoft.com/en-us/library/ms189292.aspx 是官方文档,请注意“SET 选项要求”部分
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 2023-04-08
  • 2022-01-11
相关资源
最近更新 更多