在SQL

时间:2017-06-20 02:15:11

标签: sql-server sql-server-2008-r2 rdbms sql-merge

我有一个独特的要求 - 我有一个excel格式的数据列表,我每年使用SQL的导入功能将这些数据导入SQL 2008 R2。在表格#34; Patient_Info"中,我在列#34; MemberID"上设置了主键。当我导入数据时没有任何重复,一切都很好。

但有时候,当我得到这些数据时,一些患者的信息会被更新的地址/电话等重复,并且具有相同的MemberID,因此我将其设置为主键,此记录将被保留没有导入到数据库中,因此,我没有该患者的更新记录。

修改

我不知道如何实现这一点,更新一些可能有现有memberID的行,并且非常感谢任何指向此行的指针。

以下示例:

清单1:

List 1

清单2: enter image description here

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操作不是原子操作,并且可能与它一起进入竞争状态。为确保它能正常工作,请执行以下操作:

  • 确保您的SQL Server是最新的Service Pack和补丁(SQL Server 2008 R2的当前版本是SP3,版本10.50.6000.34)。
  • 将您的MERGE换成事务(BEGIN TRAN;COMMIT TRAN;
  • 使用SERIALIZABLE提示通过T-SQL MERGE语句帮助防止潜在的竞争条件。