下面是一个存储过程,用于根据单独检查所有字段来检查数据库中是否存在重复条目(不要问为什么我应该这样做,它只需要这样).
听起来非常简单,但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.
对于每个可能为null的参数,我认为你需要这样的东西:
AND (aCode = @aCode OR (aCode IS NULL AND @aCode IS NULL))
如果我理解你的问题,那么我鼓励你做一些研究:
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.