2011-08-31 68 views
10

Soy nuevo en SSIS y necesito ayuda en este caso. Encontré un article que describe cómo detectar filas que existen y que han cambiado. La parte que me falta es cómo actualizar las filas que cambiaron. Encontré algunos artículos que dicen que también es una buena solución eliminar los registros que han cambiado e insertar un nuevo conjunto de registros. La cuestión es que no sé cómo hacer ese paso de eliminación (cuadro rojo).SSIS - Eliminar filas

¿Alguna sugerencia?

enter image description here

Respuesta

17

Si tiene que eliminar las filas dentro de datos Flujo de tareas, entonces usted necesita para utilizar la transformación OLE DB Command y escribir una instrucción DELETE como DELETE FROM dbo.Table WHERE ColumnName = ?. Luego, en las asignaciones de columnas de la transformación del comando OLE DB, asignará el parámetro representado por el signo de interrogación con los datos que provienen de la transformación anterior. En su caso, los datos que provienen de Union All 2.

Sin embargo, no recomendaría esa opción porque OLE DB Command se ejecuta para cada fila y puede ralentizar su paquete si hay demasiadas filas.

recomendaría algo como esto:

  1. redirigir la salida de la Union All 2 a una tabla de etapas temporales (por ejemplo dbo.Staging) usando Destino de OLE DB.

  2. Supongamos que su tabla de destino final es dbo.Destination. Ahora, su tabla de etapas tiene todos los registros que deben eliminarse de la tabla Destino.

  3. En la pestaña Flujo de control, colocar un Execute SQL Task después de la Data Flow Task. En la tarea Ejecutar SQL, escriba una instrucción SQL o use un procedimiento almacenado que llamaría a una instrucción SQL para unir los registros entre la Etapa y el Destino para eliminar todas las filas correspondientes de la tabla Destino.

  4. Además, coloque otra tarea de ejecución de SQL antes de la tarea de flujo de datos. En esta tarea Ejecutar SQL, elimine/trunque las filas de la tabla de etapas.

Algo como esto podría funcionar para eliminar las filas :.

DELETE  D 
FROM  dbo.Destination D 
INNER JOIN dbo.Staging  S 
ON   D.DestinationId = S.StagingId 

Espero que ayude.

+0

Esto suena como un buen plan.Lo intentaré ahora y le dejaré saber los resultados. ¡Gracias, Siva! –

+3

Por cierto, ¿cuál es su sugerencia para hacer dbo.Staging table temporal? Crear una nueva tarea de flujo de datos que eliminará esta tabla? ¿O elimino solo datos y dejo la tabla temporal siempre allí? –

-4

Te recomiendo que uses Spoon (Kettle) es más flexible, tiene una herramienta de diseño llamada "Dimension lookup/update" que te ayuda a mantener una tabla de dimensiones, puedes especificar qué acción deseas depende de los cambios de columna (actualice el registro, inserte un nuevo registro) todo esto basado en un control de versión de tiempo de los registros.

1

Además de user756519 answer. Si tiene millones de registros para eliminar el último paso (4) para ExecuteSQL, la instrucción Delete se puede hacer en lotes con algo como esto:

WHILE (1=1) 
BEGIN 
    DELETE D 
    from dbo.Destination D 
    inner join 
    (
     -- select ids that should be removed from table 
     SELECT TOP(10000) DestinationId 
     FROM 
      (
      SELECT 
       D1.DestinationId, 
       S.StagingId 
      from 
       dbo.Destination as D1 
      LEFT JOIN 
       dbo.Staging as S 
      ON 
       D1.DestinationId = S.StagingId 
      ) AS G 
     WHERE 
      StagingId IS NULL 
    ) as R 
    on D.DestinationId = R.DestinationId; 

    IF @@ROWCOUNT < 1 BREAK 

    -- info message 
    DECLARE @timestamp VARCHAR(50) 
    SELECT @timestamp = CAST(getdate() AS VARCHAR) 
    RAISERROR ('Chunk deleted %s', 10, 1,@timestamp) WITH NOWAIT 
END 
Cuestiones relacionadas