IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SSIS Discussion :

Récupération d'une date via SQL task et sauvegarde dans une variable pour un futur 'where' [2012]


Sujet :

SSIS

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut Récupération d'une date via SQL task et sauvegarde dans une variable pour un futur 'where'
    Bonjour,

    j'ai à charger différentes tables que j'aimerais charger en incrémentale. Pour se faire j'ai dans ma source une date d'intégration, et j'aimerais, pour ne charger que le nécessaire, ne récupérer les lignes qui ne sont pas encore chargées par rapport au dernier chargement effectué dans ma destination (vous me direz, je ne fais que redéfinir incrémental, mais bon...)

    J'ai donc pensé que je pouvais récupérer cette date d'intégration de ma destination pour l'intégrer dans une variable, que j'utiliserais dans la clause where de ma source.

    Je me suis donc dis que j'allais utiliser une SQL Task pour récupérer cette date.

    Mais c'est là que mes connaissances et pratiques sont limitées, je ne sais pas vraiment utiliser ce composant pour stocker cette fameuse date dans une variable (c'est une première pour moi). J'ai bien vu quelques messages déjà sur l'utilisation de variables et ressemblant de loin à ce que je veux faire... mais je n'en suis pas moins perdu...

    J'aurais donc souhaité avoir vos lumière sur comment réaliser cela et donc répondre à ses questions :
    - Variable ou paramètre ? et quelle est exactement la différence ?
    - Comment la/le charger ?
    - Comment la réutiliser dans un select ?

    Mes connecteurs sont tous en OLEDB et la source et la destination sont des serveurs différents.

    N'hésitez pas à mettre force détails et expliquer pas à pas, à destination d'un débutant comme moi.
    Je vous remercie d'avance pour votre aide.

    Cordialement,

    Slaveak

  2. #2
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Citation Envoyé par Slaveak Voir le message
    - Variable ou paramètre ? et quelle est exactement la différence ?
    Une variable est interne au package voir même a une séquence ou a un composant
    Un paramètre de package est setable via un package parent ou lors de l'exécution du package
    Citation Envoyé par Slaveak Voir le message
    - Comment la/le charger ?
    Dans ton cas composant Execute SQL Task : en indiquant que la requête a exécuter retourne un résultat a prendre en compte . Via le Paramètre ResultSet positionné soit à:
    -Single Row : si le résultat a prendre en compte est composé d'une seul ligne (Ton cas)
    -Full Result Set : si le résultat a prendre en compte est une table de plusieurs ligne
    -XML : Si le résultat est de type XML

    Puis en effectuant le mapping entre les colonnes résultante de ta requête et les variables à setter dans l'onglet Result Set.

    Citation Envoyé par Slaveak Voir le message
    - Comment la réutiliser dans un select ?
    Via une variable de type chaine de caractère Calculé contenant la requête de Type Select : Ex : ="select * From table where colonneTest ="+@[User::MaVariable]
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  3. #3
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Ok je te remercie, je vois bcp mieux comment faire, il me reste tout de même quelques questions :

    Citation Envoyé par GeekMokona Voir le message
    Une variable est interne au package voir même a une séquence ou a un composant
    Un paramètre de package est setable via un package parent ou lors de l'exécution du package
    Donc pour moi c'est une variable je pense.

    Citation Envoyé par GeekMokona Voir le message
    Dans ton cas composant Execute SQL Task : en indiquant que la requête a exécuter retourne un résultat a prendre en compte . Via le Paramètre ResultSet positionné soit à:
    -Single Row : si le résultat a prendre en compte est composé d'une seul ligne (Ton cas)
    -Full Result Set : si le résultat a prendre en compte est une table de plusieurs ligne
    -XML : Si le résultat est de type XML

    Puis en effectuant le mapping entre les colonnes résultante de ta requête et les variables à setter dans l'onglet Result Set.
    Ok, je vais regarder ça sur MSDN.
    EDIT : sur la page MSDN

    Je ne comprends pas bcp le Sens : dans le composant il y a input, outpu et return value et dans MSDN il y a écrit :
    Sens

    Sélectionnez le sens du paramètre.Associez chaque variable à un paramètre d'entrée, un paramètre de sortie ou un code de retour.
    Je ne cacherais pas que ça me perd un peu ...

    Citation Envoyé par GeekMokona Voir le message
    Via une variable de type chaine de caractère Calculé contenant la requête de Type Select : Ex : ="select * From table where colonneTest ="+@[User::MaVariable]
    Et est-il possible de "juste" ajouter la variable dans les where de mes requêtes déjà établies ? parce que sinon il faut que je "variabilise" une 50 aine de requêtes soit autant que de tables à ramener.

  4. #4
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Citation Envoyé par Slaveak Voir le message


    Ok, je vais regarder ça sur MSDN.
    EDIT : sur la page MSDN

    Je ne comprends pas bcp le Sens : dans le composant il y a input, outpu et return value et dans MSDN il y a écrit :


    Je ne cacherais pas que ça me perd un peu ...
    Attention ne confond pas le mapping de parmettre (ce qui peux permettre de paramétrer ta requête ) le lien msdn parle cette partie et le mapping de résultat

    Citation Envoyé par Slaveak Voir le message

    Et est-il possible de "juste" ajouter la variable dans les where de mes requêtes déjà établies ? parce que sinon il faut que je "variabilise" une 50 aine de requêtes soit autant que de tables à ramener.
    cela dépend du type de composant source : sur les composant attunity pour oracle le seul moyen est la variabilisation ,pour un oledb source à vérifier via l'existence d'un onglet parameter mapping ...
    50 tables sources c'est énorme , je supose tous ça dans un même package ssis , si c'est là cas ton package doit être complexe donc inmaintenable et du coup ne respect pas les bonne pratique . Il est préférable d'utiliser plusieur packages qui peuvent être appeler dans un package Parent ....
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  5. #5
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Effectivement je confondais le mapping de paramètres et et le mapping de résultat... My bad...

    Sinon pour répondre au sujet "best practice", j'ai effectivement mis le chargement des tables sources dans un même package dans les tables STG, ou il n'y a aucune transformation. je fais les transformations, calculs et historisation à partir de l'ODS. 0 partir de là il y a un package par dimension et par table de fait.

    Je me doute que ce n'est pas très "best practice" mais maintenant je perdrais trop de temps à tout réagencer... et ça ne pose pas trop de soucis de maintenance. Mais effectivement je ne le referais plus à l'avenir.,
    J'ai effectivement fais un job de lancement qui est un package parent et qui à coup de tache d'execution de package, lance tous mes jobs enfants.

    Par contre j'ai un soucis dans ce job parent en ce qui concerne des paramètres de jobs enfants qui ne veulent pas prendre de valeurs... (Je réédite ce message dès que j'ai l'intitulé exacte du message d'erreur)

    En tout cas merci bcp pour tes conseils ! ça m'a clairement éclairci et m'a permis d'avancer sereinement.

    Slaveak

  6. #6
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par GeekMokona Voir le message
    cela dépend du type de composant source : sur les composant attunity pour oracle le seul moyen est la variabilisation ,pour un oledb source à vérifier via l'existence d'un onglet parameter mapping ...
    Effectivement c'est possible.

    Grâce à tes conseils, j'ai effectivement réussi à charger ma variable pour ma date de dernier chargements, Et effectivement je peux introduire un paramètre dans une requête (uniquement dans les sources OLEDB) et appeler la fameuse variable !

    Encore une fois merci beaucoup pour tes conseils qui m'ont bien aidés à trouver la solution à mon problème !

  7. #7
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Effectivement, ça marche bien, la requête where passe bien sur une source OLE DB SQL server...

    le problème c'est que ma source de données OLE DB est connecté à un AS400... et là la variable ne passe plus dans la requête.

  8. #8
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Dans ce cas ta requête d'extraction doit être calculé dans une variable , ce qui est d'ailleurs plus maintenable par la suite , et ton OLE DB Source doit être basé sur une Commande SQL contenu dans variable
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  9. #9
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Alors ça j'ai essayé ... mais ça n'a pas marché,

    en gros ma requête est :

    select * from AS400 where DATE = @[user::datechargement] (requête très résumée mais l'idée est là)

    Tout cela mis dans la valeur de ma variable varRequete... Mais il n'accepte pas la requête...
    Est-ce que j'ai oublié un truc ?

    EDIT : pour information et que mon problème soit bien compris : la date de dernier chargement est récupéré dans une table de statistiques sur SQL server, et doit être intégrée dans ma requête d'extraction envoyée à l'AS400.
    Ce qui fait que je ne peut pas aller chercher cette date à part via une SQL task qui va charger ma viariable.

    EDIT 2 : Ce serait mieux comme ça 'select * from AS400 where DATE = '+@[user::datechargement] par contre c'est simple quote ou double ?

  10. #10
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Double Quote !
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  11. #11
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    hum... Alors c'est le "IBM DB2 for I5/OS IBMDASQL OLE DB provider" de mon connecteur à l'AS400 qui doit poser problème.

    ma requête : "SELECT * FROM AS400 WHERE (cast(DATE1 as int) >"+@[User::date1]+" AND cast(DATE1 as int) <600000) OR (cast(DATE2 as int) >"+@[User::date2]+" AND cast(DATE2 as int) < 600000)"

    Et elle ne veut pas passer... Je commence à vraiment croire que ça vient du provider IBM...

    Pour info si je remplace la variable par une valeur que je sais bonne, que je met la requête dans la variable, sans " " (en gros ça donne une requête classique dans une variable. Quand je fais un aperçu des données via ma source OLEDB qui accueille la requête, elle passe et j'ai des résultats.

    j'ai tenté pas mal de variante avec ou sans quote mais dès que je met les variables... ça foire...

  12. #12
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    bon c'est quoi l'erreur ? Es ce une Erreur SSIS ou du SGBD ? Je pense au format de tes paramètres .

    Regarde dans L'onglet "Progress" ou "Execution Results"
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  13. #13
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Non du SGBD (les<AS400> et <PACKAGE> sont des nom génériques pour remplacer les noms exactes):

    Erreur*: «*Code d'erreur SSIS DTS_E_OLEDBERROR. Une erreur OLE DB s'est produite. Code d'erreur*: 0x80004005.
    Un enregistrement OLE DB est disponible. Source*: «*IBMDA400 Command*» Hresult*: 0x80004005 Description*: «*SQL0104 : Elément syntaxique "SELECT * FROM <AS400> n'est pas correct. Eléments possibles : ( CL END GET SET CALL DROP FREE HOLD.
    Cause . . . . . : Une erreur de syntaxe a été détectée au niveau de l'élément "SELECT * <AS400>. "SELECT * FROM <AS400> n'est pas un élément correct. ( CL END GET SET CALL DROP FREE HOLD est une liste partielle des éléments corrects. Cette liste suppose que l'instruction est correcte jusqu'à cet élément. L'erreur peut être située plus haut dans l'instruction, mais la syntaxe de l'instruction apparaît correcte jusqu'à ce point. Que faire . . . : Effectuez les opérations suivantes, puis renouvelez votre demande : - Vérifiez l'instruction au niveau de l'élément "SELECT * FROM <AS400>. Corrigez-la. Il peut s'agir d'une virgule ou de guillemets manquants, ou de clauses mal ordonnées. - Si l'erreur porte sur <FIN-INSTRUCTION>, corrigez l'instruction SQL qui ne se termine pas sur une clause correcte.*».

    [SSIS.Pipeline] Erreur*: «*Échec de la phase de pré-exécution de <PACKAGE>. Code d'erreur retourné*: 0xC0202009.

  14. #14
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Donc c'est une erreur dans Ta requette , Que donne l'exécution dans Ton SGBD de la requête Visible dans le pavé Evaluated Value de ta variable
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  15. #15
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Alors voila... Justement ... j'ai fais le boulet... je mettais ma requête dans la case "valeur" et non dans l'expression avec EvaluateAsExpression à true...

    Donc maintenant ça marche nickel !

    Cette fois si ce sujet est définitivement résolu

    PS : Toutes les indications pour bien réaliser la chose dans ce sujet de blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 11/02/2014, 11h01
  2. Réponses: 2
    Dernier message: 08/07/2011, 10h01
  3. Réponses: 0
    Dernier message: 12/03/2009, 11h40
  4. Réponses: 8
    Dernier message: 15/11/2008, 23h14
  5. Réponses: 3
    Dernier message: 30/04/2007, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo