這幾天在寫 Store Procedure 時,總覺得怪怪的...怎麼結果不是我所想的,原來是變數的 Null 判斷寫法有問題... IF @val = Null IF @val is Null   的寫法結果會不同喔~而且跟 SET ANSI_NULL ON / OFF (連結為msdn說明) 的設定也有關係~

附上幾個範例,這樣看起來就清楚多了吧~
【範例一】
DECLARE @val CHAR(4)
SET @val = Null

SET ANSI_NULLS ON

IF @val = Null    print 'True'            --False
ELSE        print 'False'

IF @val is Null    print 'True'            --True
ELSE        print 'False'

SET ANSI_NULLS OFF

IF @val = Null    print 'True'            --True
ELSE        print 'False'

IF @val is Null    print 'True'            --True
ELSE        print 'False'
 【範例二】
-- Create table t1 and insert values.
CREATE TABLE t1 (a INT NULL)
INSERT INTO t1 values (NULL)
INSERT INTO t1 values (0)
INSERT INTO t1 values (1)

-- SET ANSI_NULLS to ON and test.
PRINT 'Testing ANSI_NULLS ON'
SET ANSI_NULLS ON

DECLARE @varname int
SELECT @varname = NULL
SELECT * FROM t1 WHERE a = @varname            --(影響 0 個資料列)
SELECT * FROM t1 WHERE a <> @varname          --(影響 0 個資料列)
SELECT * FROM t1 WHERE a IS NULL                --(影響 1 個資料列)

-- SET ANSI_NULLS to OFF and test.
PRINT 'Testing SET ANSI_NULLS OFF'
SET ANSI_NULLS OFF

DECLARE @varname int
SELECT @varname = NULL
SELECT * FROM t1 WHERE a = @varname             --(影響 1 個資料列)
SELECT * FROM t1 WHERE a <> @varname          --(影響 2 個資料列)
SELECT * FROM t1 WHERE a IS NULL                 --(影響 1 個資料列)

-- Drop table t1.
DROP TABLE t1
arrow
arrow
    全站熱搜

    tsuozoe 發表在 痞客邦 留言(0) 人氣()