当前位置:  开发笔记 > 数据库 > 正文

T-SQL存储过程NULL输入值导致select语句失败

如何解决《T-SQL存储过程NULL输入值导致select语句失败》经验,为你挑选了2个好方法。

下面是一个存储过程,用于根据单独检查所有字段来检查数据库中是否存在重复条目(不要问为什么我应该这样做,它只需要这样).

听起来非常简单,但SP失败了.问题是传递给SP的一些参数可能具有空值,因此sql应该读为"is null"而不是"= null".我已尝试使用exec()和sp_executesql的isnull(),case语句,coalesce()和动态sql,但未能实现其中任何一个.这是代码......

CREATE PROCEDURE sp_myDuplicateCheck
 @userId int,
 @noteType char(1),
 @aCode char(3),
 @bCode char(3), 
 @cCode char(3),
 @outDuplicateFound int OUT
AS
BEGIN
SET @outDuplicateFound = (SELECT Top 1 id FROM codeTable 
                          WHERE userId = @userId
                          AND noteType = @noteType
                          AND aCode = @aCode
                          AND bCode = @bCode
                          AND cCode = @cCode 
                          )
-- Now set the duplicate output flag to a 1 or a 0
IF (@outDuplicateFound IS NULL) OR (@outDuplicateFound = '') OR (@outDuplicateFound = 0)
 SET @outDuplicateFound = 0
ELSE 
 SET @outDuplicateFound = 1
END

n8wrl.. 10

对于每个可能为null的参数,我认为你需要这样的东西:

AND (aCode = @aCode OR (aCode IS NULL AND @aCode IS NULL))

我喜欢ISNULL(@aCode,aCode)= aCode. (10认同)

但那不行 - NULL!= NULL.你正在做的就是忽略参数,如果它是NULL,那不是OP想要的. (3认同)


G Mastros.. 7

如果我理解你的问题,那么我鼓励你做一些研究:

SET ANSI_NULLS OFF

如果在存储过程中使用此命令,则可以在比较中使用= NULL.请查看以下示例代码,了解其工作原理.

Declare @Temp Table(Data Int)

Insert Into @Temp Values(1)
Insert Into @Temp Values(NULL)

-- No rows from the following query
select * From @Temp Where Data = NULL

SET ANSI_NULLS OFF

-- This returns the rows where data is null
select * From @Temp Where Data = NULL

SET ANSI_NULLS ON

每当您将ANSI_NULLS设置为Off时,最好尽快将其设置为ON,因为这可能会影响您稍后运行的其他查询.所有SET命令仅影响当前会话,但根据您的应用程序,这可能会跨越多个查询,这就是为什么我建议您在此查询后立即重新启用ansi null.



1> n8wrl..:

对于每个可能为null的参数,我认为你需要这样的东西:

AND (aCode = @aCode OR (aCode IS NULL AND @aCode IS NULL))


我喜欢ISNULL(@aCode,aCode)= aCode.
但那不行 - NULL!= NULL.你正在做的就是忽略参数,如果它是NULL,那不是OP想要的.

2> G Mastros..:

如果我理解你的问题,那么我鼓励你做一些研究:

SET ANSI_NULLS OFF

如果在存储过程中使用此命令,则可以在比较中使用= NULL.请查看以下示例代码,了解其工作原理.

Declare @Temp Table(Data Int)

Insert Into @Temp Values(1)
Insert Into @Temp Values(NULL)

-- No rows from the following query
select * From @Temp Where Data = NULL

SET ANSI_NULLS OFF

-- This returns the rows where data is null
select * From @Temp Where Data = NULL

SET ANSI_NULLS ON

每当您将ANSI_NULLS设置为Off时,最好尽快将其设置为ON,因为这可能会影响您稍后运行的其他查询.所有SET命令仅影响当前会话,但根据您的应用程序,这可能会跨越多个查询,这就是为什么我建议您在此查询后立即重新启用ansi null.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有