【问题标题】:Scalar-valued function does not return NULL but a 'NULL' string标量值函数不返回 NULL,而是返回“NULL”字符串
【发布时间】:2018-11-05 09:25:27
【问题描述】:

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

也产生一个字符串。


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

【问题讨论】:

    标签: tsql user-defined-functions sql-server-2017


    【解决方案1】:

    用“ALTER”替换行

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

    和'if'的行

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

    【讨论】:

    • 这是一个不错的改进,但仍然会生成字符串;-(
    • 你想在函数调用字符串'null'时返回NULL吗?
    • @Vasily 和 P. ejH - 结合你的力量,输出现在是正确的! ;-)
    • 在原始函数中,如果@input 为空,它应该不满足条件并返回@input - 这是null...
    【解决方案2】:

    要为空字符串或单词 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。

    (n指的是nchar(n)nvarchar(n)中的n)

    【讨论】:

    • 这就是为什么在某些列中有单个 'N's。我不知道他们来自哪里。
    【解决方案3】:

    你应该使用set重新分配声明变量的值

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

    test

    【讨论】:

    • 好的,现在我开始相信我的 sql server 是愚蠢的。即使我在新查询中单独运行示例脚本,我仍然会看到一个字符串......我的 sql 服务器发生了什么? :-o 这不可能 :-\
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2011-05-18
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多