2010-10-22 47 views
2

我正在处理一个我无法更改的数据库模式 - 而且我需要运行批量更新。我使用相同的模式在源数据库和目标数据库之间移动数据。我知道这很糟糕,但这正是我现在正在处理的事情。需要查找第一个空字段,并更新

的模式如下:

Car 
CarType1 
CarType2 
CarType3 
CarType4 

我所试图做的 - 是把在CarTypes从我的源数据库,通过更新目标CarTypes。

我的问题是:

如果汽车 “宝马” 我的源记录已经规定,像这样3个CarTypes:

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

和我的目标有:

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

我会怎样编写一条更新语句,使得来自源的CarType1-2-3填充目标上的可用NULL字段?所以来源:CarType1 - >目标:CarType2。还有,如果目标中没有空间存在所有源字段(例如,在我的源代码中有4个CarType值,并且只有在所有源字段中有4个CarType值),那么是否有办法取消此记录的批量更新并记录消息相应的目标行中的3分NULL CarType列?

谢谢!

+0

是允许创建中间表和/或临时表吗?这不会发生n一步到位。 – Fosco 2010-10-22 12:54:07

+0

是的,我只需要运行一次。谢谢。 – user53885 2010-10-22 12:59:09

+0

是否有可能在类型列中有一个'洞'?例如'Car:BMW,CarType1:Fun Car,CarType2:NULL,CarType3:Good Handling,CarType4:null' – 2010-10-22 16:12:36

回答

1

我不知道在一个语句而是四个UPDATE语句做它做的伎俩。
最终的选择显示你所拥有的列溢出

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 
相关问题