T-SQL中,有时判断一个变量是否为NULL时,有人可能会用到函数ISNULL,如:
DECLARE
@VAR1
VARCHAR
(
20
)
DECLARE @VAR2 INT
IF ISNULL ( @VAR1 , '' ) = '' PRINT ' @VAR1 is null. '
IF ISNULL ( @VAR2 , - 1 ) = - 1 PRINT ' @VAR2 is null. '
DECLARE @VAR2 INT
IF ISNULL ( @VAR1 , '' ) = '' PRINT ' @VAR1 is null. '
IF ISNULL ( @VAR2 , - 1 ) = - 1 PRINT ' @VAR2 is null. '
这种用法其实是有问题的,再看:
DECLARE
@VAR1
VARCHAR
(
20
)
DECLARE @VAR2 INT
SET @VAR1 = ''
SET @VAR2 = - 1
IF ISNULL ( @VAR1 , '' ) = '' PRINT ' @VAR1 is null. '
IF ISNULL ( @VAR2 , - 1 ) = - 1 PRINT ' @VAR2 is null. '
DECLARE @VAR2 INT
SET @VAR1 = ''
SET @VAR2 = - 1
IF ISNULL ( @VAR1 , '' ) = '' PRINT ' @VAR1 is null. '
IF ISNULL ( @VAR2 , - 1 ) = - 1 PRINT ' @VAR2 is null. '
很显然,@VAR1和@VAR2均已赋值且不为NULL。
再看更特殊的情况:
DECLARE
@VAR3
BIT
PRINT ISNULL ( @VAR3 , - 1 )
PRINT ISNULL ( @VAR3 , - 1 )
打印出来的值是1,而不是-1,这是因为:@VAR3的类型是BIT,其可能值只有三个:0、1或NULL,如果给其赋0和NULL之外的值(此处是-1),均被认为是1。
用ISNULL函数判断变量是否为NULL,在特定上下文的业务逻辑中有可能是正常运行的,如上述@VAR1永远不会为'',@VAR2永远不会为-1的情况;还有一种情况,以@VAR1为例,如果开发人员确实希望IF分支中的语句不仅在@VAR1是NULL的时候执行,而且当@VAR1的值是一个空字符串('')时也执行。
变量是否为NULL的判断应该使用IS NULL:
DECLARE
@VAR1
VARCHAR
(
20
)
DECLARE @VAR2 INT
DECLARE @VAR3 BIT
SET @VAR1 = ''
SET @VAR2 = - 1
IF @VAR1 IS NULL PRINT ' @VAR1 is null. ' ELSE PRINT ' @VAR1 is not null. '
IF @VAR2 IS NULL PRINT ' @VAR1 is null. ' ELSE PRINT ' @VAR2 is not null. '
IF @VAR3 IS NULL PRINT ' @VAR1 is null. ' ELSE PRINT ' @VAR3 is not null. '
DECLARE @VAR2 INT
DECLARE @VAR3 BIT
SET @VAR1 = ''
SET @VAR2 = - 1
IF @VAR1 IS NULL PRINT ' @VAR1 is null. ' ELSE PRINT ' @VAR1 is not null. '
IF @VAR2 IS NULL PRINT ' @VAR1 is null. ' ELSE PRINT ' @VAR2 is not null. '
IF @VAR3 IS NULL PRINT ' @VAR1 is null. ' ELSE PRINT ' @VAR3 is not null. '
IS NULL经常用于组成一个逻辑表达式出现在单个T-SQL语句的WHERE子句中,有些人在写存储过程时遇到控制流语句却不敢用了,而改用ISNULL函数,记之。