Oracle
 sql >> Base de données >  >> RDS >> Oracle

SSIS ne parvient pas à enregistrer les packages et à redémarrer Visual Studio

Je suggère de lire les données par tranches :

Au lieu de charger toute la table, essayez de diviser les données en morceaux et de les importer dans SQL Server. Depuis un moment, j'ai répondu à une réponse similaire liée à SQLite, je vais essayer de la reproduire pour l'adapter à la syntaxe Oracle :

Guide étape par étape

Dans cet exemple, chaque bloc contient 10 000 lignes.

  1. Déclarer 2 Variables de type Int32 (@[User::RowCount] et @[User::IncrementValue] )
  2. Ajouter une tâche Execute SQL Task qui exécutent un select Count(*) et stockez le jeu de résultats dans la variable @[User::RowCount]

  1. Ajouter une boucle For avec les préférences suivantes :

  1. Dans le conteneur de la boucle for, ajoutez une Data flow task
  2. Dans la tâche de flux de données, ajoutez une ODBC Source et OLEDB Destination
  3. Dans la source ODBC, sélectionnez SQL Command option et écrivez un SELECT * FROM TABLE query *(pour récupérer uniquement les métadonnées`
  4. Mappez les colonnes entre la source et la destination
  5. Revenir au Control flow et cliquez sur la Data flow task et appuyez sur F4 pour afficher la fenêtre des propriétés
  6. Dans la fenêtre des propriétés, accédez à expression et affectez l'expression suivante à [ODBC Source].[SQLCommand] propriété :(pour plus d'informations, reportez-vous à Comment passer des variables SSIS dans l'expression ODBC SQLCommand ?)

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

MYTABLE est le nom de la table source, et IDCOLUMN est votre clé primaire ou colonne d'identité.

Capture d'écran du flux de contrôle

Références

  • Source ODBC - SQL Server
  • Comment passer des variables SSIS dans l'expression ODBC SQLCommand ?
  • COMMENT UTILISER LA SOURCE ODBC SSIS ET LA DIFFÉRENCE ENTRE OLE DB ET ODBC ?
  • Comment limiter le nombre de lignes renvoyées par une requête Oracle après la commande ?
  • Obtenir les n à n premières lignes de db2

Mise à jour 1 - Autres solutions de contournement possibles

En recherchant des problèmes similaires, j'ai trouvé des solutions de contournement supplémentaires que vous pouvez essayer :

(1) Modifier la mémoire maximale de SQL Server

  • SSIS :le gestionnaire de tampons a échoué à un appel d'allocation de mémoire

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

(2) Activer les canaux nommés

  • [Corrigé] Le gestionnaire de tampons a détecté que le système manquait de mémoire virtuelle, mais n'a pas pu échanger de tampons

    1. Allez dans Panneau de configuration -> Outils d'administration -> Gestion de l'ordinateur
    2. On Protocol for SQL Instance -> Set Named Pipes =Enabled
    3. Redémarrer le service d'instance SQL
    4. Après cela, essayez d'importer les données et les données seront récupérées par morceaux au lieu de toutes les récupérer en une seule fois. J'espère que cela fonctionnera pour vous et vous fera gagner du temps.

(3) Si vous utilisez des correctifs d'installation de SQL Server 2008

  • Le processus d'exécution SSIS 2008 se bloque lorsque vous exécutez le package SSIS 2008 dans une condition de mémoire insuffisante

Mise à jour 2 - Comprendre l'erreur

Dans le lien MSDN suivant, la cause de l'erreur était décrite comme suit :

La mémoire virtuelle est un sur-ensemble de la mémoire physique. Les processus de Windows ne spécifient généralement pas lesquels ils doivent utiliser, car cela entraverait (considérablement) la façon dont Windows peut effectuer plusieurs tâches. SSIS alloue de la mémoire virtuelle. Si Windows en est capable, toutes ces allocations sont conservées dans la mémoire physique, où l'accès est plus rapide. Cependant, si SSIS demande plus de mémoire que ce qui est physiquement disponible, cette mémoire virtuelle se répand sur le disque, ce qui ralentit considérablement le fonctionnement du package. Et dans le pire des cas, s'il n'y a pas assez de mémoire virtuelle dans le système, le paquet échouera.