Pregunta

Estoy tratando de comparar los datos de dos sistemas. La idea básica es:

  • Crear tabla temporal.
  • Insertar Tabla 1 Datos.
  • Insertar datos Tabla2 (Tabla A vinculado, de servidor remoto) con UNIQUE Ids respetado.
  • Filtro en primera o segunda tabla tiene información diferente.

Estoy intentando conseguir el segundo conjunto de inserciones, desde el segundo sistema, insertar, y si duplicado, actualizar su lugar. Me parece que no puede hacerlo bien. Para la inserción final, lo que debería tener?

No tienen la "Parte de filtro" porque no tengo los datos insertados Tabla2. La parte de filtro mostraría filas en nombre de Active, primer o último es diferente entre los dos sistemas. declaraciones de tipo simple where Table1LastName <> Table2LastName.

Nota: tengo este trabajo con 2 tablas temporales creadas ... y una combinación externa completa y algunos "donde ID es nula". Sólo estoy tratando de conseguir que esto funcione de una manera que no he usado antes.

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;
¿Fue útil?

Solución

Si está utilizando SQL 2008, vistazo a la MERGE declaración, que puede hacer lo que otras plataformas de llamada UPSERT, UPDATE si es que existe, de lo contrario INSERT.

Otros consejos

Se puede escribir una instrucción SELECT que las capturas de identificación que se han insertado desde la primera inserción en la tabla temporal.

A continuación, basta con insertar desde la segunda mesa a menos de identificación de containted en su estado de cuenta Selet anterior. Utilice una instrucción ELSE para implementar las otras filas como una actualización

Parece que usted está poniendo filas coincidentes de dos tablas en una sola fila en otra tabla.

Si ese es el caso, entonces usted necesita

  • Insertar columnas de la primera tabla, y
  • Actualización otras columnas de la segunda tabla en donde los números de identificación coincidan y donde las otras columnas son NULL.

podría estar equivocado acerca de eso, porque no está completamente claro para mí que los números de identificación en las dos tablas se van a igualar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top