标量值函数不是 return NULL,而是 'NULL' 字符串

Scalar-valued function does not return NULL but a 'NULL' string

我需要将数据从 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)

也产生一个字符串。


你知道为什么会这样吗?我该如何解决?

用“ALTER”替换行

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

并与 'if'

一致
if (LTRIM(RTRIM(@input)) = '' or @input IS NULL)

您应该使用 set

为声明的变量重新赋值
''''
BEGIN

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

    select @input

END

test

要为空字符串或单词 NULL 的字符串获取 null,您可以只使用 coalescenullif:

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

请注意,您原始代码中的问题是因为您没有指定 @input 参数的长度 - 所以 SQL 服务器将其创建为 varchar(1)
您应该 始终 指定 char/varchar/ncharnvarchar.

的长度

来自nchar and nvarchar页备注:

When n is not specified in a data definition or variable declaration statement, the default length is 1. When n is not specified with the CAST function, the default length is 30.

(nnchar(n)nvarchar(n)中的n)