需要找到第一个空字段,并更新

时间:2010-10-22 12:42:18

标签: tsql

我正在使用我无法更改的数据库架构 - 我需要运行批量更新。我正在使用相同的模式在源数据库和目标数据库之间移动数据。我知道这很糟糕,但这正是我现在正在处理的事情。

架构如下:

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值,并且仅有),则会有一种方法可以取消此记录的批量更新并记录消息3个NULL CarType列在相应的目标行中?

谢谢!

1 个答案:

答案 0 :(得分: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