2010-07-09 3 views
0

J'ai donc cette table SQL à mettre à jour. Maintenant, nous utilisons un outil pour faire le processus, donc si nous venons de renommer la colonne, cela ne fonctionnerait pas parce que notre outil laisserait tomber l'ancienne colonne et ajouter une nouvelle colonne avec le nouveau nom, donc nous devons le faire manuellement et entrer ce code dans la construction et exclure la table de notre construction.Question à propos de l'instruction SQL UPDATE avec CASE

La table que nous avons ACTUELLEMENT a une colonne appelée 'FeeTypeId'. Nous avons une autre table, une table de recherche, qui a un tas d'ID concernant les types et les descriptions. Nous voulons ce champ 'FeeTypeId' précédent sur l'autre table que je viens de mentionner, pour contenir ces LookupId qui se rapportent à leur 'FeeDescription' spécifique. Je vais avoir une feuille Excel qui contient les mappings, donc pour l'instant il n'y a pas de données réelles, juste de la logique.

Voici le script que j'ai écrit mais je ne sais pas s'il va fonctionner. Pouvez-vous m'aider?

---------------------------------------------------------------------- 
--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

Est-il acceptable de faire cela dans une procédure stockée, de sorte que vous pouvez d'abord créer une variable que vous attribuez la valeur à (en utilisant cette déclaration de cas), utilisez alors que dans votre mettre à jour? Cela améliorerait considérablement la lisibilité de votre code. – Rob

+0

Je souhaite. C'est à peu près la seule façon de le faire à cause de la façon dont nous construisons. Ils ne veulent rien ajouter à la base de données actuelle. Sinon, je créerais probablement une autre table avec toutes les nouvelles données, et je n'aurais aucun problème avec la compilation de l'ancien. Ensuite, je voudrais juste le copier. – Scott

Répondre

1

Je ne peux pas vraiment tester cela, mais ce qui suit est, selon Toad, SQL valide. Peut-être que vous pouvez essayer de lancer ceci:

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