标量值函数不是 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
要为空字符串或单词 NULL
的字符串获取 null,您可以只使用 coalesce
和 nullif
:
COALESCE(NULLIF(@input, 'NULL'), NULLIF(@Input, ''), @input)
请注意,您原始代码中的问题是因为您没有指定 @input
参数的长度 - 所以 SQL 服务器将其创建为 varchar(1)
。
您应该 始终 指定 char
/varchar
/nchar
和 nvarchar
.
的长度
来自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.
(n
指nchar(n)
或nvarchar(n)
中的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"
而不是 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
要为空字符串或单词 NULL
的字符串获取 null,您可以只使用 coalesce
和 nullif
:
COALESCE(NULLIF(@input, 'NULL'), NULLIF(@Input, ''), @input)
请注意,您原始代码中的问题是因为您没有指定 @input
参数的长度 - 所以 SQL 服务器将其创建为 varchar(1)
。
您应该 始终 指定 char
/varchar
/nchar
和 nvarchar
.
来自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.
(n
指nchar(n)
或nvarchar(n)
中的n
)