gpt4 book ai didi

sql-server - 字符串或二进制数据将被截断 : Error not caught by TRY_CAST

转载 作者:行者123 更新时间:2023-12-04 10:02:33 27 4
gpt4 key购买 nike

下面的查询...

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,您会遇到此问题是 > 8,000字节。它抛出了一个未被 TRY_CAST 捕获的错误.

下面是一个简单的演示(db <> fiddle)

DECLARE @X NVARCHAR(MAX) = 'X'
SET @X = REPLICATE(@X, 4001)

SELECT TRY_CAST(@X AS DATE)

通常 SQL Server 可以计算表达式 out of logical processing order即使所有匹配 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 (...)

关于sql-server - 字符串或二进制数据将被截断 : Error not caught by TRY_CAST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61756457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com