我正在尝试比较来自两个系统的数据。基本思想是:

  • 创建临时表。
  • 插入Table1数据。
  • 插入Table2数据(表A链接,远程服务器),具有尊重的唯一ID。
  • 第一个或第二个表具有不同信息的过滤器。

我正在尝试获取第二组插入物,从第二个系统插入,如果重复,请改为更新。我似乎无法做对。对于最终插入,我应该拥有什么?

我没有“过滤器部分”,因为我没有插入的table2数据。过滤器部分将显示两个系统之间活动,最后一个名称不同的行。简单的 where Table1LastName <> Table2LastName 类型语句。

注意:我可以使用创建2个温度表的工作...以及一个完整的外部连接和一些“ ID为null”。我只是想以以前从未使用过的方式使它工作。

if object_id('tempdb..#CompareDrs') is not null
    drop table #CompareDrs;
GO

create table #CompareDrs
(
     ID varchar(20) unique
    ,TABLE1Active varchar(1)
    ,TABLE1LastName varchar(50)
    ,TABLE1FirstName varchar(50)
    ,TABLE2Active varchar(1)
    ,TABLE2LastName varchar(50)
    ,TABLE2FirstName varchar(50)
);
GO

INSERT INTO #CompareDrs (ID, TABLE1Active, TABLE1LastName, TABLE1FirstName)
    SELECT
         right('00000000000000000000' + ForeignID, 20) ID
        ,case when Active = 0 then 'I'
              when Active = 1 then 'A'
              else ' '
         end       TABLE1Active
        ,LastName  TABLE1LastName
        ,FirstName TABLE1FirstName
    FROM
                  [DATABASE1].dbo.DRs
    Order By
        ID;
GO

INSERT Into #CompareDrs (ID, TABLE2Active, TABLE2LastName, TABLE2FirstName)
    SELECT 
         right('00000000000000000000' + Cast(DRDR# as Varchar(50)), 20) ID
        ,DRAFLG TABLE2Active
        ,DRLNAM TABLE2LastName
        ,DR1NAM TABLE2FirstName
    FROM
        [LINKEDERVER].[DATABASE].[CATALOG].[TABLE] DR
ON DUPLICATE KEY UPDATE TABLE2Active = VALUES(TABLE2Active), 
                        TABLE2LastName = VALUES(TABLE2LastName), 
                        TABLE2FirstName = VALUES(TABLE2FirstName),
GO

SELECT * FROM #CompareDrs;
有帮助吗?

解决方案

如果您正在使用SQL 2008,请查看 合并 语句,它可以执行其他平台所谓的UPSERT,如果存在,则可以更新,否则会插入。

其他提示

您可以编写一个选择的语句,该语句捕获从第一个插入到临时表中插入的ID。

然后只需从第二个表中插入,除非ID在您以前的SELET语句中的想法。使用其他语句将其他行作为更新

看来您将匹配行从两个表放入另一个表中的一行中。

如果是这样,那么您需要

  • 从第一表插入列,
  • 从第二个表中更新其他列,其中ID号匹配以及其他列为NULL的位置。

我对此可能是错误的,因为对我而言,这两个表上的ID号将匹配。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top