Condense cette instruction UPDATE avec tous ces IF NOT EXISTS

Donc, j'écris un script de mise à jour pour changer une colonne dans quelques endroits et j'essaie de find une meilleure façon de condenser ce code que d'avoir un tas de déclarations "SI NON EXISTS".

C'est le code actuel en question et je ne suis pas sûr que les Énoncés CASE seraient meilleurs ou comment s'y prendre pour les rendre plus propres?

Ce sera à la fois une expérience d'apprentissage de l'optimization efficace des requêtes et une utilisation générale. 🙂

IF NOT EXISTS ( SELECT sCM_CoverageDesc FROM SIU_CoverageMap WHERE sCM_CoverageDesc = 'ComAutoPhysDam - Garagekeepers (Comprehensive)') BEGIN UPDATE SIU_CoverageMap SET sCM_CoverageDesc = 'ComAutoPhysDam - Garagekeepers (Comprehensive)' FROM SIU_CoverageMap WHERE sCM_Code = 'GA_GKOTC' END IF NOT EXISTS ( SELECT sCM_CoverageDesc FROM SIU_CoverageMap WHERE sCM_CoverageDesc = 'ComAutoPhysDam - GarageDealers (Comprehensive) - Autos in Building') BEGIN UPDATE SIU_CoverageMap SET sCM_CoverageDesc = 'ComAutoPhysDam - GarageDealers (Comprehensive) - Autos in Building' FROM SIU_CoverageMap WHERE sCM_Code = 'GA_ABLDG' END IF NOT EXISTS ( SELECT sCM_CoverageDesc FROM SIU_CoverageMap WHERE sCM_CoverageDesc = 'ComAutoPhysDam - GarageDealers Comprehensive - Std Open Lots') BEGIN UPDATE SIU_CoverageMap SET sCM_CoverageDesc = 'ComAutoPhysDam - GarageDealers Comprehensive - Std Open Lots' FROM SIU_CoverageMap WHERE sCM_Code = 'GA_LOTS' END IF NOT EXISTS ( SELECT sCM_CoverageDesc FROM SIU_CoverageMap WHERE sCM_CoverageDesc = 'ComAutoPhysDam - GarageDealers Comprehensive - Non-Std Lots') BEGIN UPDATE SIU_CoverageMap SET sCM_CoverageDesc = 'ComAutoPhysDam - GarageDealers Comprehensive - Non-Std Lots' FROM SIU_CoverageMap WHERE sCM_Code = 'GA_NLOTS' END IF NOT EXISTS ( SELECT sCM_CoverageDesc FROM SIU_CoverageMap WHERE sCM_CoverageDesc = 'ComAutoPhysDam - GarageDealers Comprehensive - Misc Bldg') BEGIN UPDATE SIU_CoverageMap SET sCM_CoverageDesc = 'ComAutoPhysDam - GarageDealers Comprehensive - Misc Bldg' FROM SIU_CoverageMap WHERE sCM_Code = 'GA_MISC' END IF NOT EXISTS ( SELECT sCM_CoverageDesc FROM SIU_CoverageMap WHERE sCM_CoverageDesc = 'ComAutoPhysDam - Garagekeepers (Collision)') BEGIN UPDATE SIU_CoverageMap SET sCM_CoverageDesc = 'ComAutoPhysDam - Garagekeepers (Collision)' FROM SIU_CoverageMap WHERE sCM_Code = 'GA_GKCOL' END IF NOT EXISTS ( SELECT sCM_CoverageDesc FROM SIU_CoverageMap WHERE sCM_CoverageDesc = 'ComAutoPhysDam - Garage Dealers Collision') BEGIN UPDATE SIU_CoverageMap SET sCM_CoverageDesc = 'ComAutoPhysDam - Garage Dealers Collision' FROM SIU_CoverageMap WHERE sCM_Code = 'GA_BLNKC' END ELSE PRINT ('Table has already been updated.') 

La raison globale (logique métier) des blocs IF n'est pas claire.

Pourquoi ne pas créer une table de mise à jour (patch) nommée #Map et faire une mise à jour indépendamment de la correspondance. Ci-dessous TSQL joint #Map à la table d'origine sur le code pour mettre à jour la description.

 -- Patching table Create table #Map ( Desc1 varchar(128), Code1 varchar(16) ); -- Add data to table insert into #Map values ('ComAutoPhysDam - Garagekeepers (Comprehensive)', 'GA_GKOTC'), ('ComAutoPhysDam - GarageDealers (Comprehensive) - Autos in Building', 'GA_ABLDG'), ('ComAutoPhysDam - GarageDealers Comprehensive - Std Open Lots', 'GA_LOTS'), ('ComAutoPhysDam - GarageDealers Comprehensive - Non-Std Lots', 'GA_NLOTS'), ('ComAutoPhysDam - GarageDealers Comprehensive - Misc Bldg', 'GA_MISC'), ('ComAutoPhysDam - Garagekeepers (Collision)', 'GA_GKCOL'), ('ComAutoPhysDam - Garage Dealers Collision', 'GA_BLNKC'); -- Show data in table select * from #Map; -- Update regardless UPDATE SIU_CoverageMap SET sCM_CoverageDesc = m.Desc1 FROM SIU_CoverageMap c join #Map m on c.sCM_Code = m.Code1