当我将列定义为NVARCHAR(MAX)
时,我无法索引该列。但我当然无法将列定义为NVARCHAR(4000)
,因为我假设数据字符串有时会更长。
有人可以建议如何使用NVARCHAR(MAX)
数据定义对列进行索引,还是可以将长度从4000增加到更多?
答案 0 :(得分:10)
就个人而言,我不明白为什么你需要索引nvarchar(max) 您是否真的要搜索长达1GB的字符串?
无论如何,您唯一的选择是在持久计算列中使用HASHBYTES 您创建列的哈希,并索引HASH。
注意,取决于您可能无法散列nvarchar(max)的版本
对于SQL Server 2014及更早版本,允许的输入值限制为8000字节。
SQL Server 2016代码示例也强制执行唯一性 SHA2_512哈希提供最小的冲突机会。对于足够大的表格,像MD4这样较弱的哈希值会达到birthday problem
CREATE TABLE dbo.HashExample (
SomeID int NOT NULL IDENTITY(1, 1) PRIMARY KEY,
SomeLongText nvarchar(MAX) NULL,
SomeHash AS HASHBYTES('SHA2_512', SomeLongText) PERSISTED
)
GO
CREATE UNIQUE INDEX UX_SomeHash ON dbo.HashExample(SomeHash) WHERE SomeLongText IS NULL
GO
INSERT dbo.HashExample (SomeLongText) VALUES ('Row 1'), ('Row 2')
GO
SELECT * FROM dbo.HashExample
GO
DECLARE @LookFor nvarchar(MAX) = 'Row 3'
SELECT * FROM dbo.HashExample WHERE SomeHash = HASHBYTES('SHA2_512', @LookFor)
SET @LookFor = 'Row 2'
SELECT * FROM dbo.HashExample WHERE SomeHash = HASHBYTES('SHA2_512', @LookFor)
GO
注意,您无法进行LIKE搜索。仅限=
或<>