标量值函数不返回NULL,而是一个'NULL'字符串

时间:2018-11-05 09:25:27

标签: 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 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 :(得分:2)

用'ALTER'补充行

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

并以'if'开头

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

答案 1 :(得分:1)

您应该使用set

为声明的变量重新分配值
''''
BEGIN

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

    select @input

END

test

enter image description here

答案 2 :(得分:1)

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

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

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

nchar and nvarchar页上的备注:

  

在数据定义或变量声明语句中未指定n时,默认长度为1。在CAST函数中未指定n时,默认长度为30。

({nnnchar(n)中的nvarchar(n)