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 中有现有数据。但是,祈祷,可以通过在计算字段上创建索引来截断什么?
该错误不是由创建索引引起的。该错误是由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
作为值无效返回,但它不会因错误而爆炸。
归档时间: |
|
查看次数: |
2922 次 |
最近记录: |