2013-04-16 28 views
0

我有一個查詢,我正在使用它來獲取正確的類別到新數據庫中的正確的廣告,但一些受影響的行可能有多個類別,而一些可能不會,研究給了我使用'table.column + your_data'的信息,似乎這帶有副作用,雖然它不會更新NULL列,即使它說適量的行受到影響..第二個數據庫的SQL更新沒有寫入當列爲空

的SQL:

MERGE INTO sites.dbo.ads 
USING (
     SELECT e.name 
     FROM Database1.dbo.education AS e 
     INNER JOIN releducationcategory AS re ON e.educationid = re.educationid 
     INNER JOIN category AS c ON re.categoryid = c.categoryid 
     INNER JOIN string AS s ON c.categoryid = s.identifier 
     WHERE (s.string = 'Biologi, Fysikk & Kjemi') AND (e.site = 'sd') 
    ) AS source 
    ON Database2.dbo.ads.name COLLATE Finnish_Swedish_CI_AS = source.name COLLATE Finnish_Swedish_CI_AS 
    WHEN MATCHED THEN 
    UPDATE 
     SET sites.dbo.ads.category = ', biologi-fysikk-kjemi'; 

該更新運行良好時,該列是NULL,但是當已經有一個值,它會只是簡單地覆蓋..和WH恩我將其更改爲以下:

SET sites.dbo.ads.category = sites.dbo.ads.category + ', biologi-fysikk-kjemi'; 

,它只是更新不具有NULL值。但是它確實說,行同量的影響行。什麼呢?我應該做CASES嗎?

回答

2

存儲逗號分隔值幾乎總是一個壞主意,但如果你堅持做下去,這應該工作:

SET sites.dbo.ads.category = 
    COALESCE(sites.dbo.ads.category + ', ','') 
    + 'biologi-fysikk-kjemi'; 

這也將避免的第一項(從NULL切換到非當NULL)從逗號開始。

您看到此行爲的原因是,根據ANSI標準。 NULL + string = NULL。您可以把它們關掉,但不建議:

SET CONCAT_NULL_YIELDS_NULL

控制是否串聯結果爲空或空字符串處理。

重要

在SQL Server CONCAT_NULL_YIELDS_NULL的未來版本將永遠是ON和選項明確設置爲OFF任何應用程序會產生錯誤。避免在新開發工作中使用此功能,並計劃修改當前使用此功能的應用程序。

+0

你願意詳細說明爲什麼這是一個壞主意嗎?爲了將來的知識.. 是否有一些'錯誤的地方?COALESCE(sites.dbo.ads.category +',') +'biologi-fysikk-kjemi';它應該是這樣嗎?或者我只是在閱讀錯誤的東西? – Jesper

+0

它使寫入搜索更加複雜(並且這種搜索往往不能使用索引),它使更新和刪除更加複雜。 –

+0

@Jesper - 是的,我錯過了一個'''出來了,我又加入了它。 –