将值分配给十进制类型的 Null 抛出错误
Assigning values to Null throwing error on decimal type
使用 SQL 服务器 2016
我目前支持一个旧的导入例程,它用 ISNULL
包装大量动态列以整理丢失的数据。
代码动态生成SQL,提供格式为
的字符串
ISNULL(ColumnName, '') ColumnName
我刚刚遇到一个失败的例子,即在十进制或数字列上。然而,这对于整数、浮点数、实数甚至日期都可以正常工作。我可以引入更多代码来用 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;
您会发现它适用于除十进制(和数字)以外的所有情况。
正如我之前所说,我可以调整动态 sql 来查找小数和数字列,但我不明白 "why" 它在这些情况下特别不起作用。
非常感谢。
ISNULL(check_expression, replacement_value)
returns 与 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.
记录了最后一个示例的行为here:
SQL Server also returns an error when an empty string (" ") is
converted to numeric or decimal.
使用 SQL 服务器 2016
我目前支持一个旧的导入例程,它用 ISNULL
包装大量动态列以整理丢失的数据。
代码动态生成SQL,提供格式为
的字符串ISNULL(ColumnName, '') ColumnName
我刚刚遇到一个失败的例子,即在十进制或数字列上。然而,这对于整数、浮点数、实数甚至日期都可以正常工作。我可以引入更多代码来用 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;
您会发现它适用于除十进制(和数字)以外的所有情况。
正如我之前所说,我可以调整动态 sql 来查找小数和数字列,但我不明白 "why" 它在这些情况下特别不起作用。
非常感谢。
ISNULL(check_expression, replacement_value)
returns 与 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.
记录了最后一个示例的行为here:
SQL Server also returns an error when an empty string (" ") is converted to numeric or decimal.