我试图确定产品表中是否存在产品。当我运行这个tsql时,它应该返回1并退出proc,因为产品表中不存在产品ID 7777,但是它返回0.如果我在没有if语句的情况下运行它只需执行select语句,就会说@prodID
为null
。我想知道为什么它不会进入if语句,因为我正在检查它是否为空值。提前感谢您的帮助。
Declare @ProdID int
select @ProdID = dbo.productTbl.ProductID
from dbo.ProductTbl
inner join dbo.OrderTbl
on dbo.ProductTbl.ProductID = dbo.OrderTbl.ProductID
where dbo.OrderTbl.ProductID = 7777
if(@ProdID = null)
begin
raiserror('The product does not exist',16,1)
return 1
end
return 0
答案 0 :(得分:7)
在SQL Server中,使用IS NULL
检查空值而不是= null
。
if(@ProdID IS NULL)
begin
raiserror('The product does not exist',16,1)
return 1
end
return 0
答案 1 :(得分:3)
使用IS NULL运算符。 此外,没有理由在RAISERROR之后编写代码,它不会被执行。
IF @ProdID IS NULL
RAISERROR('The product does not exist',16,1)
答案 2 :(得分:2)
使用null
,unkown
,=
等常规比较运算符时,将<>
与<=
进行比较会产生true
... false
1}}也不IS
。 null
运算符可以与if(@ProdID is null)
进行比较。
{{1}}
答案 3 :(得分:2)
这取决于您的会话设置。 SQL-92
标准规定,当其中一个操作数未知(NULL
)和等于运算符的结果在三态逻辑中未知时会发生相等性,其威胁为false
in二进制逻辑。但您可以取消设置SQL Server ANSI_NULLS
设置(不推荐)并使用=
运算符。
SET ANSI_NULLS OFF
GO
DECLARE @ProdID int
IF(@ProdID = NULL)
PRINT 'ANSI_NULLS OFF'
将打印ANSI_NULLS OFF
SET ANSI_NULLS ON
GO
DECLARE @ProdID int
IF(@ProdID = NULL)
PRINT 'ANSI_NULLS OFF'
无需打印
SET ANSI_NULLS ON
GO
DECLARE @ProdID int
IF(@ProdID IS NULL)
PRINT 'ANSI_NULLS ON'
将打印ANSI_NULLS ON
答案 4 :(得分:0)
正如其他人所说,NULL
应该被理解为未知。一旦你意识到这一点,下面的比较表应该很有意义:
Cond1 Cond2 Cond1 AND Cond2 Cond1 OR Cond2
True Unknown Unknown True
False Unknown Unknown Unknown
Unknown Unknown Unknown Unknown
如果您确实想知道它是否未知,请使用IS NULL
代替= NULL