Comment résoudre les problèmes de mappage des paramètres de requête SQL lors de l'utilisation du fournisseur Oracle OLE DB ?

StackOverflow https://stackoverflow.com/questions/58540

  •  09-06-2019
  •  | 
  •  

Question

Lorsque j'essaie de saisir une requête SQL avec des paramètres à l'aide du fournisseur Oracle OLE DB, j'obtiens l'erreur suivante :

Les paramètres ne peuvent pas être extraits de la commande SQL.Le fournisseur peut ne pas aider à analyser les informations sur les paramètres de la commande.Dans ce cas, utilisez le mode d'accès "Commande SQL depuis variable", dans lequel l'intégralité de la commande SQL est stockée dans une variable.
INFORMATIONS COMPLÉMENTAIRES:
Le fournisseur ne peut pas dériver les informations sur les paramètres et SetParameterInfo n'a pas été appelé.(Fournisseur Microsoft OLE DB pour Oracle)

J'ai essayé de suivre la suggestion ici mais je ne comprends pas très bien ce qui est requis :Requêtes paramétrées sur Oracle

Des idées?

Était-ce utile?

La solution

Pour développer le lien donné dans la question :

  1. Créer une variable de package
  2. Double-cliquez sur le nom de la variable du package.(Cela permet d'accéder aux propriétés de la variable)
  3. Définissez la propriété « EvaluateAsExpression » sur true
  4. Saisissez la requête dans le générateur d'expression.
  5. Définissez la requête source OLE DB sur Commande SQL à partir d'une variable

Le générateur d'expressions peut créer dynamiquement des expressions à l'aide de variables pour créer des « requêtes paramétrées ».
Donc la requête « normale » suivante :

select * from book where book.BOOK_ID = ?

Peut être écrit dans le générateur d'expression comme :

"select * from book where book.BOOK_ID = " + @[User::BookID]

Vous pouvez ensuite effectuer la gestion des valeurs nulles et la conversion des données à l'aide du générateur d'expressions.

Autres conseils

Si vous utilisez Data Flow Task et utilisez OLE DB Source et que vous devez paramétrer votre requête :

  1. Créez une variable pour enregistrer "Complet" de l'instruction de requête :Faites un clic droit sur la zone vide en dehors du package - et cliquez sur Variables :

Variables

Cliquez sur Ajouter des variables dans la fenêtre Variables :

enter image description here

Faire en sorte que le nom soit SQL_DTFLOW_FULL ou quelque chose que vous pouvez comprendre facilement.Le variable data type est STRING

  1. Créez des variables pour enregistrer vos paramètres.

c'est-à-dire que l'ensemble des conditions de requête est :

SELECT * FROM BOOK WHERE BOOK_ID = @BookID --@BookID is SQL Parameter

dans l'exemple ci-dessus, je n'ai qu'un seul paramètre :@BookID, je dois donc créer une variable pour enregistrer mon paramètre.L'ajout de variables supplémentaires dépend de vos requêtes.

ParamAdd

Donnez-lui un nom SQL_DTFLOW_BOOKID

Le variable data type est STRING

Vous devez donc rendre votre SSIS soigné et les variables sont triées en parties compréhensibles.

Essayez de faire en sorte que le nom de la variable soit SQL_{TASK NAME}_{VariableName}

  1. Faire une expression pour SQL_DTFLOW_FULL variable, cliquez sur le numéro 1 et commencez à remplir le numéro 2.Faites en sorte que vos instructions SQL soient une instruction SQL correcte à l'aide d'un bloc de chaîne.Bloc de chaîne utilisant généralement "Double Quote" au début et à la fin.Concaténez les variables avec le bloc de chaîne.

Expression

Cliquez sur évaluer l'expression pour afficher le résultat, pour vous assurer que votre requête est correcte, copiez-collez le résultat de la requête dans SSMS.

Assurez-vous par vous-même que les variables sont exemptes d'injection SQL en utilisant votre propre logique.(Utilisez votre instinct de développeur)

  1. Ouvrez la tâche de flux de données, ouvrez l'éditeur de source OLE DB en double-cliquant sur l'élément.

Data Flow

  • Sélectionnez le mode d'accès aux données : SQL Command From Variable
  • Sélectionnez le nom de la variable : SQL_DTFLOW_FULL
  • Cliquez sur Aperçu pour vous assurer que cela fonctionne.

C'est tout, ma façon d'éviter ce cas d'échec SSIS.Depuis que j'utilise cette méthode, je n'ai jamais eu ce problème, vous savez, quelque chose de bizarre dans SSIS.

Pour modifier la valeur de la variable, définissez-la avant la tâche de flux de données, le résultat SQL de SQL_DTFLOW_FULL la variable changera à chaque fois que vous modifierez la valeur de votre variable.

Dans mon cas, le problème était que j'avais des commentaires dans le SQL sous la forme normale de /* */ et j'avais également des alias de colonne comme "Nom de la colonne" au lieu de [Nom de la colonne].

Une fois que je les ai supprimés, cela fonctionne.

Essayez également d'avoir votre paramètre ?déclaration dans la clause WHERE et non dans les JOINS, cela faisait également partie du problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top