为十进制类型的Null抛出错误分配值

Mat*_*ker 6 sql-server null decimal isnull

使用SQL Server 2016

我目前正在支持一个旧的导入例程,该例程包装了许多动态列,ISNULL以整理丢失的数据。

该代码在动态SQL中生成,并提供以下格式的字符串:

ISNULL(ColumnName, '') ColumnName
Run Code Online (Sandbox Code Playgroud)

我刚遇到一个实例,它已经落在了上面,即在十进制或数字列上。但是,这对于整数,浮点数,实数甚至日期都可以正常工作。我可以引入更多代码来替换''0但我不明白为什么它适用于浮点数和实数,但不适用于小数或数字。

例如看一下:

DECLARE @Test1 AS TABLE (Val FLOAT NULL);           
DECLARE @Test2 AS TABLE (Val INT NULL);             
DECLARE @Test3 AS TABLE (Val REAL NULL);    
DECLARE @Test4 AS TABLE (Val Date NULL);    

DECLARE @TestWillFail AS TABLE (Val DECIMAL(19,6) NULL);   

INSERT INTO @Test1 VALUES (NULL)
INSERT INTO @Test2 VALUES (NULL)
INSERT INTO @Test3 VALUES (NULL)
INSERT INTO @Test4 VALUES (NULL) 
INSERT INTO @TestWillFail VALUES (NULL) 

SELECT ISNULL(Val, '') VAL FROM @Test1;
SELECT ISNULL(Val, '') VAL FROM @Test2;
SELECT ISNULL(Val, '') VAL FROM @Test3;
SELECT ISNULL(Val, '') VAL FROM @Test4;

SELECT ISNULL(Val, '') VAL FROM @TestWillFail;
Run Code Online (Sandbox Code Playgroud)

您会看到它适用于除十进制(和数字)之外的所有情况。

正如我之前所说,我可以调整动态sql以查找小数和数字列,但是我不明白“为什么”在这些情况下特别不起作用。

非常感谢。

Sal*_*n A 0

ISNULL(check_expression, replacement_value)返回与check_expression ( ref )相同的类型。在您的示例中,它尝试将 varchar 转换'' 回原始数据类型

SELECT CAST('' AS FLOAT)         -- 0
SELECT CAST('' AS INT)           -- 0
SELECT CAST('' AS REAL)          -- 0
SELECT CAST('' AS DATE)          -- 1900-01-01
SELECT CAST('' AS DECIMAL(19,6)) -- Error converting data type varchar to numeric.
Run Code Online (Sandbox Code Playgroud)

最后一个示例的行为记录如下

当空字符串 (" ") 转换为数字或小数时,SQL Server 也会返回错误。