2010-10-22 2 views
2

Je travaille avec un schéma de base de données que je ne peux pas changer - et j'ai besoin d'exécuter une mise à jour en vrac. Je déplace des données entre les bases de données source et cible, avec le même schéma. Je sais que c'est affreux, mais c'est ce sur quoi je travaille en ce moment.Besoin de trouver le premier champ vide, et mettre à jour

Le schéma est le suivant:

Car 
CarType1 
CarType2 
CarType3 
CarType4 

Ce que je suis en train de faire - est de mettre sur les CarTypes de ma base de données source, en mettant à jour les CarTypes cibles.

Ma question est la suivante:

Si mon dossier source pour la voiture "BMW" a 3 CarTypes spécifié comme ceci:

Car: BMW 
CarType1: Fast 
CarType2: Well Made 
CarType3: Good Handling 
CarType4: NULL 

et mon objectif a:

Car: BMW 
CarType1: Fun Car 
CarType2: NULL 
CarType3: NULL 
CarType4: NULL 

Comment pourrais-je écrire une instruction de mise à jour telle que CarType1-2-3 de la source remplirait les champs NULL disponibles sur la cible? Donc Source: CarType1 -> Cible: CarType2. Et aussi - y aurait-il un moyen d'annuler la mise à jour groupée pour cet enregistrement et de consigner un message s'il n'y avait pas de place dans la cible pour tous les champs source (disons s'il y a 4 valeurs CarType dans ma source, et seulement 3 colonnes CarType NULL dans la ligne cible correspondante?

Merci!

+0

la création de tables intermédiaires et/ou temporaires est-elle permise? n en une étape. – Fosco

+0

Oui, je n'ai besoin de l'exécuter qu'une seule fois. Je vous remercie. – user53885

+0

Est-il possible d'avoir un 'trou' dans les colonnes de type? Par exemple 'Car: BMW, CarType1: Fun Car, CarType2: NULL, CarType3: Bonne gestion, CarType4: null' –

Répondre

1

Je ne sais pas le faire dans une déclaration, mais quatre UPDATE faire l'affaire.
les spectacles de sélection finale vous les colonnes avez débordé

DECLARE @CarsSource TABLE (Car VARCHAR(32), CarType1 VARCHAR(32), CarType2 VARCHAR(32), CarType3 VARCHAR(32), CarType4 VARCHAR(32)) 
DECLARE @CarsDestination TABLE (Car VARCHAR(32), CarType1 VARCHAR(32), CarType2 VARCHAR(32), CarType3 VARCHAR(32), CarType4 VARCHAR(32)) 

INSERT INTO @CarsSource VALUES ('BMW', 'Fast', 'Well Made', 'Good Handling', NULL) 
INSERT INTO @CarsSource VALUES ('Overflow', 'Fast', 'Well Made', 'Good Handling', 'Overflow') 

INSERT INTO @CarsDestination VALUES ('BMW', 'Fun Car', NULL, NULL, NULL) 
INSERT INTO @CarsDestination VALUES ('Overflow', 'Fun Car', NULL, NULL, NULL) 

UPDATE @CarsDestination 
SET  CarType1 = s.CarType1 
     , CarType2 = s.CarType2 
     , CarType3 = s.CarType3 
     , CarType4 = s.CarType4 
FROM @CarsDestination d 
     INNER JOIN @CarsSource s ON s.Car = d.Car 
WHERE d.Cartype1 IS NULL   

UPDATE @CarsDestination 
SET  CarType2 = s.CarType1 
     , CarType3 = s.CarType2 
     , CarType4 = s.CarType3 
FROM @CarsDestination d 
     INNER JOIN @CarsSource s ON s.Car = d.Car 
WHERE d.Cartype2 IS NULL   

UPDATE @CarsDestination 
SET  CarType3 = s.CarType1 
     , CarType4 = s.CarType2 
FROM @CarsDestination d 
     INNER JOIN @CarsSource s ON s.Car = d.Car 
WHERE d.Cartype3 IS NULL   

UPDATE @CarsDestination 
SET  CarType4 = s.CarType1   
FROM @CarsDestination d 
     INNER JOIN @CarsSource s ON s.Car = d.Car 
WHERE d.Cartype4 IS NULL   

SELECT * 
FROM @CarsSource s 
     LEFT OUTER JOIN @CarsDestination d ON COALESCE(d.Cartype4, d.Cartype3, d.Cartype2, d.Cartype1) = COALESCE(s.Cartype4, s.Cartype3, s.Cartype2, s.Cartype1) 
WHERE d.Car IS NULL 
Questions connexes