我有一个独特的要求 - 我有一个excel格式的数据列表,我每年使用SQL的导入功能将这些数据导入SQL 2008 R2。在表格#34; Patient_Info"中,我在列#34; MemberID"上设置了主键。当我导入数据时没有任何重复,一切都很好。
但有时候,当我得到这些数据时,一些患者的信息会被更新的地址/电话等重复,并且具有相同的MemberID,因此我将其设置为主键,此记录将被保留没有导入到数据库中,因此,我没有该患者的更新记录。
修改
我不知道如何实现这一点,更新一些可能有现有memberID的行,并且非常感谢任何指向此行的指针。
以下示例:
清单1:
答案 0 :(得分:2)
这不是一个非常独特的要求。
您可以用来解决此问题的一种可接受的模式是将您的数据导入" staging"表。登台表与您要导入的目标表具有相同的结构,但它将是一个堆 - 它没有主键。
导入数据后,您将使用查询将较新的数据记录与MemberID
的旧数据记录合并。
一旦您整合了所有相同的MemberID
记录,就不会有重复的MemberID
值,然后您可以将所有临时表记录插入到目标表中。
修改强>
正如@Panagiotis Kanavos建议的那样,您可以使用SQL MERGE
语句来插入新记录并将现有记录从登台表更新到目标表。
假设Staging表名为Patient_Info_Stage
,目标表名为Patient_Info
,并且这些表具有类似的模式。还假设字段MemberId
是表Patient_Info
的主键。
以下MERGE
语句将临时表数据合并到目标表中:
BEGIN TRAN;
MERGE Patient_Info WITH (SERIALIZABLE) AS Target
USING Patient_Info_Stage AS Source
ON Target.MemberId = Source.MemberId
WHEN MATCHED THEN UPDATE
SET Target.FirstName = Source.FirstName
,Target.LastName = Source.LastName
,Target.Address = Source.Address
,Target.PhoneNumber = Source.PhoneNumber
WHEN NOT MATCHED THEN INSERT (
MemberID
,FirstName
,LastName
,Address
,PhoneNumber
) Values (
Source.MemberId
,Source.FirstName
,Source.LastName
,Source.Address
,Source.PhoneNumber
);
COMMIT TRAN;
*注意:T-SQL MERGE
操作不是原子操作,并且可能与它一起进入竞争状态。为确保它能正常工作,请执行以下操作:
MERGE
换成事务(BEGIN TRAN;
,COMMIT TRAN;
)SERIALIZABLE
提示通过T-SQL MERGE
语句帮助防止潜在的竞争条件。