2011-11-20 77 views
1

假設我有一個表'xyz',列a,b,c,d,e,並且我發現表中的列隨機爲空。現在我必須掃描整個表,找出列是空的,並用默認值更新列(例如a'a',b'b',c'c'...),而其他列在行不變。如何做到這一點?使用默認值更新TABLE列

我已經創建瞭如下的程序,但它並不好兆頭對我說:在預期

create procedure SP_DEFAULTS as 
update xyz set a= 'a', 
b= 'b', 
c= 'c' 
d= 'd', 
e= 'e' 

where (a='' 
or b='' 
or c='' 
or d='' 
or e='' 
) 

感謝

回答

2

目前你有什麼將更新整個行,當字段爲空。您將不得不做更多這樣的事情,以便您只能在空白時更新該字段。同樣在你完成SP之後,你應該爲每個字段設置表格的默認值,這樣就不會再發生了。

UPDATE xyz 
SET a = 'a' 
WHERE a = '' 

UPDATE xyz 
SET b = 'b' 
WHERE b = '' 

UPDATE xyz 
SET c = 'c' 
WHERE c = '' 

UPDATE xyz 
SET d = 'd' 
WHERE d = '' 

UPDATE xyz 
SET e = 'e' 
WHERE e = '' 
+0

@ user653622:這是最簡單的方法,但是如果你需要這些字段是動態的,它將比這更復雜;我們將使用動態SQL,我們可能必須訪問系統表。 – Nonym

4

不要運行你的SQL。你會更新錯誤的東西。

update xyz 
set 
    a=CASE 
     WHEN LTRIM(ISNULL(a,''))='' THEN 'a' 
     ELSE a 
    END, 
    b=CASE 
     WHEN LTRIM(ISNULL(b,''))='' THEN 'b' 
     ELSE b 
    END, 
    c=CASE 
     WHEN LTRIM(ISNULL(c,''))='' THEN 'c' 
     ELSE c 
    END, 
    d=CASE 
     WHEN LTRIM(ISNULL(d,''))='' THEN 'a' 
     ELSE d 
    END, 
    e=CASE 
     WHEN LTRIM(ISNULL(e,''))='' THEN 'a' 
     ELSE e 
    END 
WHERE 
(
     LTRIM(ISNULL(a,''))='' 
    OR LTRIM(ISNULL(b,''))='' 
    OR LTRIM(ISNULL(c,''))='' 
    OR LTRIM(ISNULL(d,''))='' 
    OR LTRIM(ISNULL(e,''))='' 
) 
+0

這是一個好主意。爲什麼我沒有想到:P?必須在早上太早。 –

+0

同意這個想法,但我認爲你不需要'LTRIM'。而且,SET子句中的表達式可能更簡單:'a = ISNULL(NULLIF(a,''),'a')'。 –

+0

我添加了修剪,其中包含零空值,空字符串和由空格組成的字符串。 – UnhandledExcepSean

2
update xyz set 
a=coalesce(a,'a'), 
b=coalesce(b,'b'), 
c=coalesce(c,'c'), 
d=coalesce(d,'d') 

聚結在一系列值/變量的返回TEH第一非空值。所以如果字段a爲空,那麼它返回字符串'a'

我會使用pk和evalalute在其上放置一個where子句,如果這樣做你想要的然後刪除where子句。它更新每個字段的每個值,但在信息已經存在的地方,它使用該信息。