sql-server - 将值赋给 Null 在十进制类型上抛出错误

标签 sql-server null decimal isnull

使用 SQL Server 2016

我目前支持一个旧的导入例程,该例程使用 ISNULL 包装大量动态列来整理丢失的数据。

代码以动态 SQL 形式生成,并提供格式为的字符串

ISNULL(ColumnName, '') ColumnName

我刚刚遇到一个实例,该实例发生了故障,即在小数或数字列上。然而,这对于整数、 float 、实数甚至日期来说效果很好。我可以引入更多代码来用 0 替换 '',但我不明白为什么它适用于 float 和实数,但不适用于小数或数字。

作为示例,请看一下:

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 来查找小数和数字列,但我不明白“为什么”它在这些情况下不起作用。

非常感谢。

最佳答案

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.

最后一个示例的行为已记录 here :

SQL Server also returns an error when an empty string (" ") is converted to numeric or decimal.

关于sql-server - 将值赋给 Null 在十进制类型上抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55144122/

相关文章:

sql-server - 彻底删除 mssql linux

c# - 如何在 T4 中实例化 EF6 上下文?

sql-server - SQL Server - varchar 值的转换溢出了 int 列

mysql - jdbc-mysql 如果变量为空, "' +变量 +'"的值会发生什么?

java - 仅在需要时显示 double 的小数

java - 计算小数点后的数字,包括最后一个零

sql - 显示来自不同表的数据,并以摘要形式显示详细信息

sql-server - 如何比较数据库列中的 Null 值

file - 如何 'cut' 为空?

javascript - Angular 绑定(bind)打破了小数位