如果某字段为NULL则复制上一条不为null的数据(主键连续和不连续情况下)
表结构:

SQL(主键连续):

SELECT TOP 1000 [ActId] ,[ActName] INTO #T --创建临时表测试,如果测试没问题,改成原表 FROM [DB_Test].[dbo].[Act] WHILE EXISTS(SELECT * FROM #T WHERE ActName IS NULL) BEGIN declare @a INT DECLARE @b VARCHAR(50) SELECT @a=#T.[ActId], @b=[ActName] FROM #T JOIN (SELECT TOP 1 a.ActId FROM #T a WHERE a.ActName IS NULL) b ON b.ActId-1 = #T.ActId UPDATE #T SET ActName=@b WHERE ActId=@a+1 AND ActName IS NULL END
SQL(主键不连续):

--需求:如果ActName为NULL则复制上一条不为null的数据(主键ActId不连续) SELECT [ActId] ,[ActName] ,ROW_NUMBER() OVER(ORDER BY ActId) AS 'nid' --虚拟连续主键 INTO #T --临时表 FROM [DB_Test].[dbo].[Act] WHILE EXISTS(SELECT 1 FROM dbo.Act WHERE ActName IS NULL) --遍历原表 BEGIN DECLARE @actId INT DECLARE @actName VARCHAR(50) SELECT TOP 1 @actId=ActId FROM #T WHERE ActName IS NULL --找到ActName为NULL第一行的ActId SELECT @actName = c.ActName FROM dbo.Act c WHERE c.ActId = ( --找到原表ActName为NULL第一行的上一行的ActName SELECT b.ActId FROM #T b WHERE b.nid = ( SELECT TOP 1 a.nid - 1 FROM #T a WHERE a.ActName IS NULL)) UPDATE dbo.Act SET ActName=@actName WHERE ActId=@actId --更新 DELETE FROM #T WHERE ActId=@actId --删除临时表ActName为NULL第一行 END DROP TABLE #T

浙公网安备 33010602011771号