下面的查询...
SELECT YEAR(TRY_CAST(m.MetaValue AS DATE))
FROM MetaData m
...导致此错误:
String or binary data would be truncated.
如果我将查询过滤到有效的记录集,错误就会消失:
SELECT YEAR(TRY_CAST(m.MetaValue AS DATE))
FROM MetaData m
WHERE m.MetaKey IN (...)
如果我尝试根据所选表达式进行过滤,查询将再次失败:
SELECT * FROM (
SELECT YEAR(TRY_CAST(m.MetaValue AS DATE)) AS Yr
FROM MetaData m
WHERE MetaKey IN (...)
) x
WHERE x.Yr > 1900
这里发生了什么?我感觉到 SQL Server 正在将查询优化为以下内容,但我不知道如何防止它:
SELECT YEAR(TRY_CAST(m.MetaValue AS DATE)) AS Yr
FROM MetaData m
WHERE MetaKey IN (...)
AND YEAR(TRY_CAST(m.MetaValue AS DATE)) > 1900
如果您遇到此问题MetaValue
is > 8,000
字节。它抛出一个未被捕获的错误TRY_CAST
.
下面是一个简单的演示(数据库 小提琴)
DECLARE @X NVARCHAR(MAX) = 'X'
SET @X = REPLICATE(@X, 4001)
SELECT TRY_CAST(@X AS DATE)
一般来说,SQL Server 可以计算表达式不符合逻辑处理顺序即使所有匹配的都可能导致这种情况WHERE MetaKey IN (...)
条件是短字符串(也警告here).
守护着TRY_CAST
在额外的CASE
表达式应该解决这种情况下的问题
SELECT CASE WHEN DATALENGTH(m.MetaValue) <8000 THEN YEAR(TRY_CAST(m.MetaValue AS DATE)) END
FROM MetaData m
WHERE m.MetaKey IN (...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)