2013-02-13 117 views
0

假設我有2個表命名aTable1,aTable2爲什麼Ansi_nulls不起作用?

aTable1有用戶ID設置爲身份和包含以下數據:

userID email   FirstName LastName 
1  NULL    C   CC 
2  NULL    D   DD 
3  [email protected]  A   AA 
4  [email protected]  B   BB 
5  [email protected]  E   EE 
6  [email protected]  NULL   NULL 
7  [email protected]  NULL   NULL 

aTable2包含以下數據:

userID email   FirstName LastName Title 
3  [email protected]  A   AA  student 
4  [email protected]  B   BB  student 
5  [email protected]  E   EE  student 
NULL NULL    C   CC  dean 
NULL NULL    D   DD  advisor 
NULL [email protected] NULL NULL    student2 
NULL [email protected] NULL NULL    student3 

我想基於aTable1更新aTable2.userID,但知道兩個表中有空值,所以我這樣做:

set ANSI_NULLS off 
update aTable2 
set aTable2.userID = a.userID 
from aTable a, aTable2 b 
where a.FirstName = b.FirstName and a.LastName = b.LastName and a.email = b.email 

但是,此更新不會更新所有用戶ID,事實上,它只會更新那些電子郵件不等於空的郵件,但我已將ANSI_NULLS設置爲關閉。 我做錯了什麼?

回答

2

爲了讓您的更新查詢工作,你可以嘗試這樣的事:

UPDATE a2 
SET 
    userId = a.UserId 
FROM 
    aTable2 a2 
    JOIN aTable1 a ON 
     ISNULL(a.Email,'NULL') = ISNULL(a2.Email,'NULL') AND 
     ISNULL(a.FirstName,'NULL') = ISNULL(a2.FirstName,'NULL') AND 
     ISNULL(a.LastName,'NULL') = ISNULL(a2.LastName,'NULL') 

當值NULL,我隨意的值設置爲「NULL」 - 使用一些不同值不會顯示在您的數據中,以確保您不會收到誤報。

我也看到了使用或標準在JOIN和檢查NULL這兩個值的其他解決方案:

((a.Email = a2.Email) OR (a.Email IS NULL AND a2.Email IS NULL)) ... 

好運。

+0

謝謝,isNull是訣竅。 – ngunha02 2013-02-13 01:43:37

+0

@JackyNguyen - np,很高興能幫到你! – sgeddes 2013-02-13 01:44:18

5

據記載,it won't work

SET ANSI_NULLS ON影響的比較只有在比較的操作數之一可以是一個變量,它是NULL或文字NULL。如果比較的兩邊都是列或複合表達式,則該設置不影響比較。