Tsql 标量值函数不返回NULL,而是返回一个';空';一串
我需要将数据从Excel导入ms sql数据库,我认为使用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
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。我不知道他们从哪里来。