如果您的字符串值太长,则索引创建将失败。我使用SQL Server 2012尝试了一些测试代码。
CREATE TABLE dbo.foo
(ID bigint not null identity(1,1),
SerializedValue nvarchar(max),
LongValue as TRY_CAST(SerializedValue as bigint));
INSERT INTO dbo.foo (serializedvalue) VALUES(REPLICATE(' ', 4000)+'1');
CREATE INDEX GotToTry ON foo(LongValue);
DROP TABLE dbo.foo;
GO
我的快速实验表明,只要nvarchar(max)值不超过4000个字符,该代码就可以工作。(当然,最后没有任何内容的所有空格都折叠为没有字符,因此可以正常工作。)第4001个字符触发String or binary data would be truncated
消息。因此,您可以检查数据以获取长度超过4000个字符的SerializedValue。
编辑:是的,转换为BIGINT
。问题不是问题BIGINT
,而是问题NVARCHAR(MAX)
。例如:
- 如果一行包含“ 1111111111111111111”,它将同时
CREATE INDEX
将值转换为BIGINT
。
- 如果一行是0到4000'1's,则可以
CREATE INDEX
,但是该值可能是NULL
因为它溢出了BIGINT
。
- 如果一行的长度超过4000个字符,则
CREATE INDEX
失败。
因此,似乎NVARCHAR(MAX)的实际内容对CREATE INDEX至关重要。
编辑:乔恩·西格尔(Jon Seigel)确定,当字符串长于nvarchar(4000)时,TRY_CAST会触发创建索引失败。