Tsql 标量值函数不返回NULL,而是返回一个';空';一串

Tsql 标量值函数不返回NULL,而是返回一个';空';一串,tsql,user-defined-functions,sql-server-2017,Tsql,User Defined Functions,Sql Server 2017,我需要将数据从Excel导入ms sql数据库,我认为使用OPENROWSET将是一个好主意。。。嗯,这不坏,但有一些副作用 我收到的数据并非总是100%正确。所谓正确,我指的是应该为NULL(在Excel中为空)的单元格有时包含字符串“NULL”,或者一些其他垃圾,如空格。我尝试用以下脚本修复它: GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[NullIfEmpty](@input n

我需要将数据从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”
的字符串,而不是真正的
NULL
,因此查询数据库后的网格单元不是黄色的,而是包含普通文本,即使目标列允许
NULL

一个简单的测试:

select dbo.nullifempty('NULL')

也会产生一个字符串


你知道为什么会发生这种情况,以及我如何解决它吗?

用“ALTER”回复行

与“如果”一致

if (LTRIM(RTRIM(@input)) = '' or @input IS NULL)
用“ALTER”替换行

与“如果”一致

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

您应该使用
set

''''
BEGIN

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

    select @input

END


您应该使用
set

''''
BEGIN

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

    select @input

END


要为空字符串或是单词
null
的字符串获取null,您可以使用
coalesce
nullif

COALESCE(NULLIF(@input, 'NULL'), NULLIF(@Input, ''), @input)
请注意,原始代码中的问题是因为您没有指定
@input
参数的长度-因此SQL Server将其创建为
varchar(1)

您应该始终
char
/
varchar
/
nchar
nvarchar
指定长度

从第页备注:

当数据定义或变量声明语句中未指定n时,默认长度为1。如果未使用CAST函数指定n,则默认长度为30


n
参考
nchar(n)
nvarchar(n)
中的
n

要为空字符串或为单词
null
的字符串获取null,您可以使用
合并
null if

COALESCE(NULLIF(@input, 'NULL'), NULLIF(@Input, ''), @input)
请注意,原始代码中的问题是因为您没有指定
@input
参数的长度-因此SQL Server将其创建为
varchar(1)

您应该始终
char
/
varchar
/
nchar
nvarchar
指定长度

从第页备注:

当数据定义或变量声明语句中未指定n时,默认长度为1。如果未使用CAST函数指定n,则默认长度为30


n
参考
nchar(n)
nvarchar(n)
中的
n

这是一个很好的改进,但仍然产生一个字符串-(当使用字符串'NULL'调用函数时,是否也要返回NULL?@Vasily和P.ejH-通过您的组合,输出现在是正确的!;-)在原始函数中,如果
@input
为null,则应使该条件失败并返回
@input
-即
null
…这是一个很好的改进,但仍会生成一个字符串-(当使用字符串'NULL'调用函数时,是否也要返回NULL?@Vasily和P.ejH-通过您的幂加起来,输出现在是正确的!;-)在原始函数中,如果
@input
为NULL,则应使条件失败并返回
@input
-即
NULL
…确定,现在我开始相信我的sql server是愚蠢的。即使我在新查询中单独运行示例脚本,我仍然会看到一个字符串。。。我的sql server怎么了-o这不可能:-\n好吧,现在我开始相信我的sql server是愚蠢的。即使我在新查询中单独运行示例脚本,我仍然会看到一个字符串。。。我的sql server怎么了-o这不可能是:-\N这就是为什么在某些列中有单个
'N'
s。我不知道它们是从哪里来的。这就是为什么在一些列中有单个的
'N'
s。我不知道他们从哪里来。