Присвоение значений нулевой ошибке в десятичном типе - PullRequest
6 голосов
/ 13 марта 2019

Использование 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 для поиска десятичных и числовых столбцов, но яне понимаю "почему", в этих случаях это не работает.

Большое спасибо.

1 Ответ

0 голосов
/ 13 марта 2019

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.

Поведение последнего примера задокументировано здесь :

SQL Server также возвращает ошибку, когда пустая строка ("") преобразуется в числовое или десятичное число.

...