在计算字段上创建索引:字符串或二进制数据将被截断

Sha*_*ehr 8 sql-server sql-server-2012

我有一个Foo包含以下字段的表:

ID bigint not null identity(1,1),
SerializedValue nvarchar(max),
LongValue as TRY_CAST(SerializedValue as bigint)
Run Code Online (Sandbox Code Playgroud)

现在我想在 LongValue 上创建一个索引,以便我可以轻松查找表示数字的序列化值。

create nonclustered index IX_Foo on Foo(LongValue);
Run Code Online (Sandbox Code Playgroud)

其中向我吐出以下错误:

字符串或二进制数据将被截断。

是的,SerializedValue 中有现有数据。但是,祈祷,可以通过在计算字段上创建索引来截断什么?

Jon*_*gel 8

该错误不是由创建索引引起的。该错误是由TRY_CAST在创建索引时评估计算列值引起的。

如果我运行这个:

SELECT TRY_CAST(REPLICATE(CONVERT(nvarchar(MAX), N'a'), 4001) AS bigint)
Run Code Online (Sandbox Code Playgroud)

我犯了同样的错误。

文件说,(重点煤矿):

如果转换成功,TRY_CAST 返回指定数据类型的值;如果发生错误,则返回 null。但是,如果您请求明确不允许的转换,则 TRY_CAST 会失败并显示错误。

现在,尚不清楚在哪些情况下它会因错误而失败(考虑到函数的全部意义,这似乎有点愚蠢,但无论如何......),所以我们可以通过转换输入值来修复代码(使用一些东西表中的数据是合理的),因为当它不适合 bigint 时,无需处理巨大的字符串:

SELECT TRY_CAST(LEFT(REPLICATE(CONVERT(nvarchar(MAX), N'1'), 4001), 100) AS bigint)
Run Code Online (Sandbox Code Playgroud)

这将NULL作为值无效返回,但它不会因错误而爆炸。