T-SQL CONVERT 错误但 TRY_CONVERT 没有空值

Ste*_*ost 0 sql t-sql sql-server

在 SQL Server 2014 select 子句中,

AVG(CONVERT(DECIMAL(11, 8), p.[Total])) AS [Value]
Run Code Online (Sandbox Code Playgroud)

其中p.[Total]的类型为varchar(50),会引发此错误:

消息 8115,级别 16,状态 8,第 2 行
将 varchar 转换为数据类型 numeric 时发生算术溢出错误

AVG(TRY_CONVERT(DECIMAL(11, 8), p.[Total])) AS [Value]
Run Code Online (Sandbox Code Playgroud)

返回任何空值,当 CONVERT 失败时它应该这样做。当我省略 [Value] 列时,返回的行数与使用 TRY_CONVERT 时相同。

另外,使用 TRY_CONVERT 保留 [Value] 并使用过滤空值

HAVING AVG(TRY_CONVERT(DECIMAL(11, 8), p.[Total])) IS NULL
Run Code Online (Sandbox Code Playgroud)

不返回任何行。为什么TRY_CONVERT似乎对所有行(无空值)都有效,但CONVERT事实并非如此?

Gor*_*off 5

表达方式:

AVG(TRY_CONVERT(decimal(11, 8), p.[Total]))
Run Code Online (Sandbox Code Playgroud)

NULL仅当所有值都无法转换时才会返回。

您需要以下形式的非聚合查询:

select p.total
from t
where try_convert(decimal(11, 8), p.total) is null;
Run Code Online (Sandbox Code Playgroud)