sql >> Base de Datos >  >> RDS >> Sqlserver

SSIS:uso de un contenedor de bucle foreach para actualizar registros después de la transferencia

Probablemente ya hayas encontrado una respuesta a tu pregunta. Esta respuesta es para ayudar a otros que puedan tropezar con esta pregunta. Aquí hay una opción posible que se puede usar para resolver la transferencia de datos usando SSIS. Supuse que aún puede crear cadenas de conexión que apunten a sus servidores A y B desde el paquete SSIS. Si esa suposición es incorrecta, hágamelo saber para que pueda eliminar esta respuesta. En este ejemplo, estoy usando SQL Server 2008 R2 como back-end. Como no tengo dos servidores, he creado dos tablas idénticas en diferentes Schemas ServidorA y ServidorB .

Proceso paso a paso:

  1. En el Connection manager sección del SSIS, cree dos conexiones OLE DB, a saber, ServerA y ServidorB . Este ejemplo apunta al mismo servidor, pero en su escenario, las conexiones deberán apuntar a sus dos servidores diferentes. Consulte la captura de pantalla n.°1 .

  2. Cree dos esquemas ServerA y ServerB . Crea la tabla dbo.ItemInfo en ambos esquemas. Los scripts para crear estas tablas se encuentran en Scripts. sección. Nuevamente, estos objetos son solo para este ejemplo.

  3. He llenado ambas tablas con algunos datos de muestra. Tabla ServerA.ItemInfo contiene 2,222 rows y tabla ServerB.ItemInfo contiene 10,000 rows . Según la pregunta, los 7778 faltantes las filas deben transferirse desde ServerB a ServerA . Consulte la captura de pantalla n.º 2 .

  4. En la pestaña de flujo de control del paquete SSIS, coloque una tarea de flujo de datos como se muestra en la captura de pantalla #3 .

  5. Haga doble clic en la tarea de flujo de datos para navegar a la pestaña de flujo de datos y configurar la tarea de flujo de datos como se describe a continuación. Servidor B es un OLE DB Source; Buscar registro en el Servidor A es una Lookup transformation task y Servidor A es un OLE DB Destination .

  6. Configurar OLE DB Source Servidor B como se muestra en las capturas de pantalla #4 y #5 .

  7. Configurar Lookup transformation task Buscar registro en el Servidor A como se muestra en las capturas de pantalla #6 - #8 . En este ejemplo, ItemId es la clave única. Por lo tanto, esa es la columna utilizada para buscar registros faltantes entre las dos tablas. Dado que solo necesitamos las filas que no existen en Servidor A , debemos seleccionar la opción Redirect rows to no match output .

  8. Coloque un OLE DB Destination en la tarea de flujo de datos. Cuando conecte la tarea de transformación de búsqueda con el destino OLE DB, se le solicitará Input Output Selection diálogo. Seleccione Lookup No Match Output desde el cuadro de diálogo como se muestra en la captura de pantalla #9 . Configure el OLE DB Destination Servidor A como se muestra en las capturas de pantalla #10 y #11 .

  9. Una vez que la tarea de flujo de datos esté configurada, debería verse como se muestra en la captura de pantalla #12 .

  10. La ejecución de muestra del paquete se muestra en la captura de pantalla #13 . Como puede notar, las 7,778 rows faltantes han sido transferidos desde Server B al Server A . Consulte la captura de pantalla #14 para ver el recuento de registros de la tabla después de la ejecución del paquete.

  11. Dado que el requisito era simplemente insertar los registros faltantes, se ha utilizado este enfoque. Si desea actualizar los registros existentes y eliminar los registros que ya no son válidos, consulte el ejemplo que proporcioné en este enlace. SQL Integration Services para cargar el archivo delimitado por tabulaciones? El ejemplo en el enlace muestra cómo transferir un archivo sin formato a SQL, pero actualiza los registros existentes y elimina los registros no válidos. Además, el ejemplo está ajustado para manejar una gran cantidad de filas.

Espero que ayude.

Guiones

.

CREATE SCHEMA [ServerA] AUTHORIZATION [dbo]
GO

CREATE SCHEMA [ServerB] AUTHORIZATION [dbo]
GO

CREATE TABLE [ServerA].[ItemInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemId] [varchar](255) NOT NULL,
    [ItemName] [varchar](255) NOT NULL,
    [ItemType] [varchar](255) NOT NULL,
    CONSTRAINT [PK_ItemInfo] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [UK_ItemInfo_ItemId] UNIQUE NONCLUSTERED ([ItemId] ASC)
) ON [PRIMARY]
GO

CREATE TABLE [ServerB].[ItemInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemId] [varchar](255) NOT NULL,
    [ItemName] [varchar](255) NOT NULL,
    [ItemType] [varchar](255) NOT NULL,
    CONSTRAINT [PK_ItemInfo] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [UK_ItemInfo_ItemId] UNIQUE NONCLUSTERED ([ItemId] ASC)
) ON [PRIMARY]
GO

Captura de pantalla n.º 1:

Captura de pantalla n.º 2:

Captura de pantalla n.º 3:

Captura de pantalla n.º 4:

Captura de pantalla n.º 5:

Captura de pantalla n.º 6:

Captura de pantalla n.º 7:

Captura de pantalla n.º 8:

Captura de pantalla n.º 9:

Captura de pantalla n.º 10:

Captura de pantalla n.º 11:

Captura de pantalla n.º 12:

Captura de pantalla n.º 13:

Captura de pantalla n.º 14: