sql >> Base de Datos >  >> RDS >> Oracle

SSIS no puede guardar paquetes y reinicia Visual Studio

Sugiero leer los datos en fragmentos:

En lugar de cargar toda la tabla, intente dividir los datos en partes e importarlos a SQL Server. Hace un tiempo, respondí una respuesta similar relacionada con SQLite, intentaré reproducirla para que se ajuste a la sintaxis de Oracle:

Guía paso a paso

En este ejemplo, cada fragmento contiene 10000 filas.

  1. Declarar 2 variables de tipo Int32 (@[User::RowCount] y @[User::IncrementValue] )
  2. Agregar una Execute SQL Task que ejecutan un select Count(*) y almacene el conjunto de resultados en la variable @[User::RowCount]

  1. Agregue un For Loop con las siguientes preferencias:

  1. Dentro del contenedor de bucles for agregue una Data flow task
  2. Dentro de la tarea de flujo de datos, agregue un ODBC Source y OLEDB Destination
  3. En la Fuente ODBC seleccione SQL Command opción y escriba un SELECT * FROM TABLE consulta *(para recuperar metadatos solamente`
  4. Asignar las columnas entre origen y destino
  5. Volver al Control flow y haga clic en Data flow task y presiona F4 para ver la ventana de propiedades
  6. En la ventana de propiedades, vaya a expresión y asigne la siguiente expresión a [ODBC Source].[SQLCommand] propiedad:(para obtener más información, consulte ¿Cómo pasar variables SSIS en la expresión ODBC SQLCommand?)

    "SELECT * FROM MYTABLE ORDER BY ID_COLUMN
    OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
    

Donde MYTABLE es el nombre de la tabla de origen y IDCOLUMN es su clave principal o columna de identidad.

Captura de pantalla del flujo de control

Referencias

  • Fuente ODBC - Servidor SQL
  • ¿Cómo pasar variables SSIS en la expresión ODBC SQLCommand?
  • ¿CÓMO USAR LA FUENTE ODBC DE SSIS Y LA DIFERENCIA ENTRE OLE DB Y ODBC?
  • ¿Cómo limito el número de filas devueltas por una consulta de Oracle después de realizar el pedido?
  • Obtención de n a n filas superiores de db2

Actualización 1:otras posibles soluciones

Mientras buscaba problemas similares, encontré algunas soluciones adicionales que puede probar:

(1) Cambiar la memoria máxima de SQL Server

  • SSIS:el administrador de búfer falló en una llamada de asignación de memoria

    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'max server memory', 4096;
    GO
    RECONFIGURE;
    GO
    

(2) Habilitar canalizaciones con nombre

  • [Solucionado] El administrador de búfer detectó que el sistema tenía poca memoria virtual, pero no pudo intercambiar ningún búfer

    1. Ir a Panel de control -> Herramientas administrativas -> Administración de equipos
    2. En protocolo para instancia de SQL -> Establecer canalizaciones con nombre =Enabled
    3. Reiniciar el servicio de instancia de SQL
    4. Después de eso, intente importar los datos y obtendrá los datos en fragmentos ahora en lugar de obtenerlos todos a la vez. Espero que funcione para ustedes y les ahorre tiempo.

(3) Si usa SQL Server 2008, instale revisiones

  • El proceso de tiempo de ejecución de SSIS 2008 se bloquea cuando ejecuta el paquete de SSIS 2008 en una condición de poca memoria

Actualización 2:comprender el error

En el siguiente enlace de MSDN, la causa del error se describe de la siguiente manera:

La memoria virtual es un superconjunto de la memoria física. Los procesos en Windows generalmente no especifican cuáles deben usar, ya que eso inhibiría (en gran medida) la forma en que Windows puede realizar múltiples tareas. SSIS asigna memoria virtual. Si Windows puede hacerlo, todas estas asignaciones se mantienen en la memoria física, donde el acceso es más rápido. Sin embargo, si SSIS solicita más memoria de la que está disponible físicamente, esa memoria virtual se derrama en el disco, lo que hace que el paquete funcione mucho más lento. Y en el peor de los casos, si no hay suficiente memoria virtual en el sistema, el paquete fallará.