2010-07-09 113 views
0

所以我有這個SQL表,我需要更新。現在我們使用一個工具來完成這個過程,所以如果我們只是重命名了列,那麼它不起作用,因爲我們的工具只會刪除舊列並添加一個新列名,所以我們必須手動完成並輸入這段代碼放入構建中並從我們的構建中排除該表。關於SQL UPDATE與CASE語句的問題

我們目前擁有的表中有一個名爲「FeeTypeId」列。我們有另一張表,一張查找表,它有許多與類型和描述相關的ID。我們希望前面提到的另一個表上的'FeeTypeId'字段包含這些LookupId,這些LookupId與其特定的'FeeDescription'相關。我將有一個包含映射的Excel工作表,因此目前沒有真正的數據,只有邏輯。

這是我寫的腳本,但我不知道它是否會運行。你們能幫我嗎?

---------------------------------------------------------------------- 
--PRE_UPGRADE-- 
---------------------------------------------------------------------- 

CREATE TABLE dbo.TmpFeesToRules(OldValue varchar, NewValue varchar) 
--populate with values from Excel 

---------------------------------------------------------------------- 
--POST UPGRADE-- 
---------------------------------------------------------------------- 

UPDATE Lending.ApplicationFee 
    SET FeeTypeId = 
     CASE t.NewValue 
      WHEN <> null THEN (SELECT LookupID FROM tblLookup WHERE LookupType = 'FEE_CODE' AND LookupDesc = t.NewValue) 
      ELSE (SELECT LookupID FROM tblLookup WHERE LookupType = 'FEE_CODE' AND LookupCode = 'OTHER') END 
      -- else might change, might not even need an else 

    FROM TmpFeesToRules t INNER JOIN tblLookup l ON t.NewValue = l.LookupDesc 

    -- Drop the tmp table 
    DROP TABLE dbo.TmpFeesToRules 
+0

是否可以接受這樣做在存儲過程中,因此你可以首先創建您的值賦給(使用case語句)一個變量,然後使用您的更新?這會嚴重提高你的代碼的可讀性。 – Rob 2010-07-09 12:59:25

+0

我希望。由於我們的構建方式,這幾乎是唯一可以完成的方式。他們不希望添加到實際數據庫中的任何內容。否則,我可能會創建另一個包含所有新數據的表格,然後在構建時會丟棄舊的東西。然後我會複製它。 – Scott 2010-07-09 13:02:02

回答

1

我不能真正測試這個,但根據Toad的說法,以下是有效的SQL。或許你可以嘗試運行此:

UPDATE Lending.ApplicationFee 
SET FeeTypeId = 
(
    CASE WHEN t.NewValue IS NOT NULL THEN 
     (SELECT LookupID FROM tblLookup WHERE LookupType = 'FEE_CODE' AND LookupDesc = t.NewValue) 
    ELSE 
     (SELECT LookupID FROM tblLookup WHERE LookupType = 'FEE_CODE' AND LookupCode = 'OTHER') 
    END 
) 
FROM TmpFeesToRules t 
INNER JOIN tblLookup l ON t.NewValue = l.LookupDesc