使用SQL Server 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以查找小数和数字列,但是我不明白“为什么”在这些情况下特别不起作用。
非常感谢。
答案 0 :(得分: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.
上一个示例的行为记录在here中:
当空字符串(“”)为时,SQL Server也返回错误。 转换为数字或十进制。