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