"merge command" 是否可以在不同的 sql 服务器上与 link 一起使用? (SPortagesql, T: SQL => MERGE)

Does "merge command" work with link on different sql servers? (S: Potrgesql, T: MsSQL => MERGE)

我正在使用我的源服务器 Postgresql、目标服务器 MSSQL 和 SSIS 执行 Slowly Changed Dimension SCD1 和 SCD2 操作。我花了很多时间 select 不断地从工具栏中选择一个工具。我想改用 MERGE 命令。我想通过给出 link 来使用 Merge 命令。这可能吗?

可以通过使用 USING 作为子查询创建合并语句和 PostgreSQL 链接服务器的 openquery。但是性能应该是个问题。我更喜欢将你的 PostgreSQL table 的副本加载到 MsSQL table 然后执行 MERGE 语句。这取决于您的源 table 的大小,因为 table 是根据 PostgreSQL 的请求始终加载到 tempdb 数据库中的。

是的,你是对的,下面的代码在小 table 中有效。将 OleDB link 提供给大型 table 将解决问题。抱歉,目前没有适用于 PostgreSQL 的免费 OleDB 提供程序。

    MERGE INTO [MYTEST_STAGE1].dbo.DimOrganizationType AS t USING
      (SELECT ID,
              CompanyID,
              Name,
              LocationTypeID
       FROM POSTGRESQL35W.erp.[ERP].OrganizationType) AS s (ID, CompanyID, Name, LocationTypeID) ON t.ID=s.ID WHEN MATCHED
    AND (isnull(t.CompanyID, 0)<>isnull(s.CompanyID, 0)
         OR t.Name<>s.Name
         OR isnull(t.LocationTypeID, 0)<>isnull(s.LocationTypeID, 0)) THEN
    UPDATE
    SET t.CompanyID=s.CompanyID,
        t.Name=s.Name,
        t.LocationTypeID=s.LocationTypeID,
        t.ModifiedDate=GETDATE(),
        t.ModifiedByUser=@@SERVERNAME+'/'+@@SERVICENAME WHEN NOT MATCHED BY TARGET THEN
    INSERT (ID,
            CompanyID,
            Name,
            LocationTypeID,
            loadDate,
            LoadByUser)
    VALUES (s.ID, s.CompanyID, s.Name, s.LocationTypeID, GETDATE(), @@SERVERNAME+'/'+@@SERVICENAME) WHEN NOT MATCHED BY SOURCE THEN
    DELETE;