de interrogación en una llave duplicada ACTUALIZACIÓN
-
16-10-2019 - |
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;
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 ??p>
- 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.