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的临时表以获得所有唯一值,然后只需对目标运行更新。