Скалярная функция возвращает не NULL, а строку NULL - PullRequest
0 голосов
/ 05 ноября 2018

Мне нужно импортировать данные из Excel в базу данных MS SQL, и я подумал, что использование OPENROWSET было бы неплохо ... ну, это неплохо, но имеет некоторые побочные эффекты.

Данные, которые я получаю, не всегда верны на 100%. Под правильными я подразумеваю, что ячейки, которые должны быть NULL (а в Excel пустыми), иногда содержат строку "NULL" или другие ненужные пробелы. Я попытался исправить это с помощью этого скрипта:

GO    
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[NullIfEmpty](@input nvarchar)
RETURNS nvarchar(max)
AS
BEGIN

    if (@input = '' or @input = 'NULL')
    begin
        return NULL
    end

    return @input

END

Но происходят странные вещи. Это дает мне строку с текстом "NULL" вместо real NULL, поэтому ячейка сетки после запроса к базе данных не желтая, а содержит обычный текст, даже если целевой столбец допускает NULL.

Простой тест с:

select dbo.nullifempty('NULL')

или

select dbo.nullifempty(null)

также возвращает строку.


Знаете ли вы, почему это происходит, и как я могу это исправить?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Вы должны переназначить значение для объявленной переменной, используя set

''''
BEGIN

    if (@input = '' or @input = 'NULL')
    begin
        set @input = NULL
    end

    select @input

END

тест

enter image description here

0 голосов
/ 05 ноября 2018

Чтобы получить значение NULL для пустых строк или строк, которые являются словом NULL, вы можете просто использовать coalesce и nullif:

COALESCE(NULLIF(@input, 'NULL'), NULLIF(@Input, ''), @input)

Обратите внимание, что проблема в исходном коде заключается в том, что вы не указали длину параметра @input - поэтому SQL Server создал его как varchar(1).
Вы должны всегда указать длину для char / varchar / nchar и nvarchar.

От nchar и nvarchar примечания к странице:

Если n не указано в определении данных или в объявлении переменной, длина по умолчанию равна 1. Если n не указана с помощью функции CAST, длина по умолчанию равна 30.

(n относится к n в nchar(n) или nvarchar(n))

0 голосов
/ 05 ноября 2018

заменить строки с помощью 'ALTER'

ALTER FUNCTION [dbo].[NullIfEmpty](@input nvarchar(max))

и со строкой 'if'

if (LTRIM(RTRIM(@input)) = '' or @input IS NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...