比较sqlserver中两个表的行

比较sqlserver中两个表的行,sql,sql-server,stored-procedures,cursor,Sql,Sql Server,Stored Procedures,Cursor,是否有人可以为我提供以下问题的代码: 我在sql server中有两个表。两个表具有相同数量的字段和字段名。如果我将这两个表视为ActualData和TempData,我需要使用列“databaseID”将ActualData表中的数据更新为TempData表中的数据,例如,如果在TempData表后面 DatabaseID | FirstName | MiddleName 277459 | VALINDA | CLAY 283934 | LAURA | MARIE

是否有人可以为我提供以下问题的代码:

我在sql server中有两个表。两个表具有相同数量的字段和字段名。如果我将这两个表视为ActualData和TempData,我需要使用列“databaseID”将ActualData表中的数据更新为TempData表中的数据,例如,如果在TempData表后面

DatabaseID | FirstName |  MiddleName    
277459 | VALINDA | CLAY         
283934 | LAURA | MARIE          
2.7E+13 | Jamie | Hawley
我需要在ActualData表中找到与TempData中的行具有相同数据库ID的行,并用TempData表中的记录替换整个记录。如果在ActualData中找不到该记录,则需要将该记录从TempData添加到ActualData中。需要对TempData中的所有记录执行此操作。
我怎样才能做到这一点?

听起来你只是想要一个加入的更新:

UPDATE A
SET
    A.FirstName = B.FirstName 
   ,A.MiddleName = B.Middlename
FROM
    ActualData A
    JOIN
    TempData B ON A.databaseID = B.databaseID
和插入:

INSERT INTO ActualData 
SELECT *
FROM TempData 
WHERE databaseID  NOT IN (SELECT DISTINCT databaseID  FROM ActualData)
假设您有110个字段,您可能希望先删除,然后插入,因为您可以在不列出列的情况下同时执行这两项操作:

DELETE FROM ActualData 
WHERE databaseID  IN (SELECT DISTINCT databaseID FROM ActualData)
然后在删除后执行上面的插入。不知道是否有方法在不列出列的情况下使用联接进行更新。

尝试以下操作:

 update ad
 set FirstName = td.FirstName,
     Middlename = td.MiddleName
 from ActualData ad
 inner join TempData td
 on ad.DatabaseID = td.DatabaseId
 where ad.FirstName != td.FirstName or ad.MiddleName != td.MiddleName

 insert into ActualData (DatabaseId, FirstName, MiddleName)
 select td.DatabaseId, td.FirstName, td.MiddleName
 from TempData td 
 left outer join ActualData ad on td.DatabaseId = ad.DatabaseId
 where ad.DatabaseId is null

使用与sql 2000及更高版本兼容的更新/插入命令

Update ActualData
Set FirstName = TempData.FirstName,
MiddleName = TempData.MiddleName
FROM ActualData
INNER JOIN TempData ON ActualData.DatabaseId = TempData.DatabaseId

insert into ActualData(DatabaseId, FirstName, MiddleName)
SELECT TempData.DatabaseId, TempData.FirstName, TempData.MiddleName
FROM TempData
LEFT OUTER JOIN ActualData ON ActualData.DatabaseId = TempData.DatabaseId
WHERE ActualData.DatabaseId IS NULL

或者您可以使用merge命令

如果记录不存在,OP也会请求插入。SQL Server的哪个版本?您已经大致描述了merge的功能。我建议您开始研究文档。Martin Smith-Iam使用Sql Server 2012如何处理TempData中的所有记录?tempdata表中大约有10k条记录。这将适用于tempdata中每个具有与不同数据匹配的dataseid的记录,以及tempdata中每个在实际数据中没有匹配记录的记录。试试看,谢谢你。但在示例表中,我只有3个字段,而在原始表中有100多个字段。那么,我们如何设置所有字段的值呢?您需要将每个字段添加到update子句中,如果需要,还需要将每个字段添加到where子句中。或者,您可以删除Temp中存在的所有实际记录,然后重新插入Temp中的所有记录。在看到您对110个字段的评论后,我将删除添加到了我的答案中。谢谢saamorim。如果我有大约110个字段,如何设置这些值?如果希望它是动态的,那么应该基于syscolumns创建一个动态sql语句。要查询syscolumns,请从sys.columns中选择名称,其中id=object\u id'ActualData'。因为我不喜欢动态sql,所以通常我会在sys.columns中查询列名,并将其粘贴到excel中,然后应用公式=A1&,=TempDataA1将为您提供所有100列的更新主体。希望我能帮忙
Update ActualData
Set FirstName = TempData.FirstName,
MiddleName = TempData.MiddleName
FROM ActualData
INNER JOIN TempData ON ActualData.DatabaseId = TempData.DatabaseId

insert into ActualData(DatabaseId, FirstName, MiddleName)
SELECT TempData.DatabaseId, TempData.FirstName, TempData.MiddleName
FROM TempData
LEFT OUTER JOIN ActualData ON ActualData.DatabaseId = TempData.DatabaseId
WHERE ActualData.DatabaseId IS NULL