6 sql t-sql parameters null stored-procedures
下面是一个存储过程,用于根据单独检查所有字段来检查数据库中是否存在重复条目(不要问为什么我应该这样做,它只需要这样).
听起来非常简单,但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
Run Code Online (Sandbox Code Playgroud)
n8w*_*wrl 10
对于每个可能为null的参数,我认为你需要这样的东西:
AND (aCode = @aCode OR (aCode IS NULL AND @aCode IS NULL))
Run Code Online (Sandbox Code Playgroud)
如果我理解你的问题,那么我鼓励你做一些研究:
SET ANSI_NULLS OFF
Run Code Online (Sandbox Code Playgroud)
如果在存储过程中使用此命令,则可以在比较中使用= 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
Run Code Online (Sandbox Code Playgroud)
每当您将ANSI_NULLS设置为Off时,最好尽快将其设置为ON,因为这可能会影响您稍后运行的其他查询.所有SET命令仅影响当前会话,但根据您的应用程序,这可能会跨越多个查询,这就是为什么我建议您在此查询后立即重新启用ansi null.
| 归档时间: |
|
| 查看次数: |
54395 次 |
| 最近记录: |