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

Tsql 需要找到第一个空字段,并进行更新,tsql,Tsql,我正在使用一个无法更改的数据库模式,我需要运行批量更新。我使用相同的模式在源数据库和目标数据库之间移动数据。我知道这很糟糕,但这正是我目前正在处理的问题 模式如下: Car CarType1 CarType2 CarType3 CarType4 我试图做的是,通过更新目标CarTypes,从源数据库中引入CarTypes 我的问题是: 如果我的汽车“BMW”源记录中指定了3种类型,如下所示: Car: BMW CarType1: Fast CarType2: Well Made CarType

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

模式如下:

Car
CarType1
CarType2
CarType3
CarType4
我试图做的是,通过更新目标CarTypes,从源数据库中引入CarTypes

我的问题是:

如果我的汽车“BMW”源记录中指定了3种类型,如下所示:

Car: BMW
CarType1: Fast
CarType2: Well Made
CarType3: Good Handling
CarType4: NULL
我的目标是:

Car: BMW
CarType1: Fun Car
CarType2: NULL
CarType3: NULL
CarType4: NULL
如何编写update语句,使源代码中的CarType1-2-3填充目标上可用的空字段?所以来源:CarType1->目标:CarType2。还有-如果目标中没有空间容纳所有源字段(例如,如果我的源中有4个CarType值,而对应的目标行中只有3个NULL CarType列),是否有办法取消此记录的批量更新并记录消息


谢谢!

我不知道如何在一条语句中完成,但四条更新语句就可以了。
最后一个选择显示溢出的列

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

是否允许创建中间表和/或临时表?这绝不会一步完成。是的,我只需要运行一次。谢谢。是否可能在类型列中有一个“洞”?例如
Car:BMW,CarType1:Fun Car,CarType2:NULL,CarType3:Good Handling,CarType4:NULL
您知道这不是一个规范化的表吗?如果您使用一个临时表来放入cartypes,首先是来自目标的,然后是来自源的。下一步是写出目标表,如果表中仍有一些条目,则将它们放入日志中。别忘了,您有一个喜欢将所有内容存储在某些表中的数据库-使用它。我最终做到了加载一个带有UNION的临时表以获得所有唯一值,然后只需对目标运行更新。