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

MS SQL Server Discussion :

Problème avec des requêtes dynamiques [2012]


Sujet :

MS SQL Server

  1. #1
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut Problème avec des requêtes dynamiques
    Bonjour, je cherche à mettre en place des triggers pour tracer des actions éffectuées en base de donnée, seulement je rame pour construire l'un deux.

    Je souhaite récupérer la valeur d'un champ, mais ce code-ci me retourne le nom de la colonne et non sa valeur !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @Value = (SELECT @column FROM UneTable)
    @column contenant bien sûr le nom d'un champ

    J'ai bien sûr éssayé quelque chose comme sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @SQL = ('SET @Value = (SELECT '+@Column+' FROM UneTable WHERE IdTable = @ID)')
    EXEC(@SQL)
    Mais j'ai un méssage d'érreur qui m'est retourné me disant que ma variable @Value n'est pas déclarée... Alors que je la déclare bien comme il faut, pareil pour @ID


    J'ai lu sur le web qu'il faudrait utiliser des fonctions ou quelque chose dans ce genre, mais j'ai pas réussi non plus.
    Faire un SELECT ou un INSERT dynamiquement me pose aucun problème, mais un SET de variable, j'y ai passé mon après-midi sans succès

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour

    C'est normal car avec EXEC, la requête est exécutée dans un nouveau contexte, où vos variables n'existent pas.


    Un peu de lecture pour résoudre ce problème

  3. #3
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Merci !

    Oui j'avais identifié le problème de contexte avec EXEC mais ne savais comment le contourner, merci pour le lien, j’essaie sa tout de suite !

  4. #4
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    hmm, quelque chose semble foirer dans ma requête, la valeur retournée est toujours le nom de colonne et non la valeur de ce champ !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE @Column nvarchar(50)
    DECLARE @Value nvarchar(max)
    DECLARE @SQL  nvarchar(max)
     
    SET @SQL = N'SELECT @col FROM EcrituresComptable WHERE IdEcriture = (SELECT MAX(IdEcriture) FROM EcrituresComptable)';
     
    SET @Value = N'@col varchar(50), @ValueOUT varchar(50) OUTPUT';
    EXEC sp_executesql @SQL, @Value, @col = @Column, @ValueOUT = @Value OUTPUT;

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Oui !

    Il faut mettre le nom de la colonne, et non la variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET @SQL = N'SELECT ' + @col + ' FROM EcrituresComptable WHERE IdEcriture = (SELECT MAX(IdEcriture) FROM EcrituresComptable)';

  6. #6
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Oui !

    Il faut mettre le nom de la colonne, et non la variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET @SQL = N'SELECT ' + @col + ' FROM EcrituresComptable WHERE IdEcriture = (SELECT MAX(IdEcriture) FROM EcrituresComptable)';
    Sa fonctionne ! Merciiii !

    EDIT : Ah ouai, ok sa m'affiche le résultat escompté, sauf que quand je fais un 'SELECT @Value', la valeur retournée est NULL

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Vous n'avez pas précisé votre besoin global, ni tout ce que faisaient vos triggers, mais notez tout de même qu'il existe des fonctionnalités intégrées à SQL Server pour tracer les modifications, comme par exemple CHANGE DATA CAPTURE qui a en plus l'avantage d'être asynchrone, et ne pénalise donc pas les opérations de mise à jour. Je vous invite à y jeter un oeil pour voir si cela correspond à votre besoin.

  8. #8
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Je n'ai pas précisé le besoin car ce n'est pas mon premier post à ce sujet et que j'en ai déja discuté, bossant sur une instance EXPRESS il me semble que CDC n'est pas disponible, mais je sais qu'il éxiste quelque chose comme Data Tracking, mais il ne correspond pas exactement à mon besoin, mon boss m'a demandé une tâche précise, à savoir recenser un évènement dans une table et écrire le détail des champs insérés dans une autre D'ou mon problème de triggers a requêtes dynamiques ! Mais merci pour votre aide

    Un dernier détail, ma requête fonctionne mais le résultat n'est pas stocké dans @Value, comment faire ? :/

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par StripMat Voir le message
    Je n'ai pas précisé le besoin car ce n'est pas mon premier post à ce sujet et que j'en ai déja discuté, bossant sur une instance EXPRESS il me semble que CDC n'est pas disponible, mais je sais qu'il éxiste quelque chose comme Data Tracking, mais il ne correspond pas exactement à mon besoin, mon boss m'a demandé une tâche précise, à savoir recenser un évènement dans une table et écrire le détail des champs insérés dans une autre D'ou mon problème de triggers a requêtes dynamiques ! Mais merci pour votre aide
    Oui, je me souviens de cette discussions maintenant, je n'avais pas fait le rapprochement.
    Cela dit, ça n'explique pas non plus pourquoi vous avez besoin de requête dynamique; Est-ce pour éviter d'ecrire à la main les requetes pour chaque colonne a tracer ?
    Si c'est le cas, vous pourriez simplement faire un requete pour créer les requête automatiquement, et copier le résultat dans votre trigger.
    Sauf si vous avez besoin que le trigger s'adapte automatiquement aux modifications de structure de la table...


    Citation Envoyé par StripMat Voir le message
    Un dernier détail, ma requête fonctionne mais le résultat n'est pas stocké dans @Value, comment faire ? :/
    Il me semblait aussi qu'il manquait quelque chose

    Il faut que votre SELECT dynamique affecte la valeur à @valueOUT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET @SQL = N'SELECT @ValueOUT=' + @col + ' FROM EcrituresComptable WHERE IdEcriture = (SELECT MAX(IdEcriture) FROM EcrituresComptable)';

  10. #10
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Le trigger que j'éssai de construire est placé sur une table contenant les évènements se produisant sur plusieurs tables, donc avec des structures différentes. Et j'éssaie, pour chaque évènement, d'écrire le détail (collone + valeur insérée) dans une autre table, grace à ce trigger. Donc oui on peut dire que le trigger doit s'adapter aux différentes structures des tables que j'audit (dans ma table recensant les évènements j'ai un champ contenant la table ou l'évènement à eu lieu).

    Exemple :

    Un utilisateur insert un relevé dans ReleveCompte, un premier trigger va écrire dans la table JournalLog quelque info d'identification de l'auteur de l'INSERT et le nom de la table ou la ligne est insérée. Et dans un deuxième temps le trigger placé sur JournalLog doit récupérer les infos insérés dans la table RelevéCompte, à savoir le nom des champs et les valeurs insérés (la dernière ligne inséré, étant donné la rapidité d'éxecution je ne pense pas qu'il y aura de problème, même si je sais que récupérer la dernière ligne inséré n'est pas terrible) et les insérer dans la table Log.

    J'espers être assez claire

    Quoiqu'il en soit, j'arrive à insérer toutes les info que je souhaite dans ma table Log sauf la valeur des champs insérés dans ReleveCompte.

    La méthode n'est peut-être pas la bonne mais je dois faire avec cette architecture de bdd

    EDIT : Merci pour la correction de ma requête, j'éssaye sa tout de suite !
    EDIT2: Sa fonctionne, j'adore ! Merci beaucoup !!!

  11. #11
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Aie, nouveau soucis...

    Mes triggers fonctionnent, sa fonctionne comme je le souhaite. Mais je dois scripter la création des bases de données client, contenant des triggers sur certaines tables, et là, sa coince...

    Comment faire sa ? Sachant que dans certains triggers je déclare des variables et leur attribut avec une requête sur une des tables de la BDD, c'est sa qui pose problème...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SET @SQL ='
    CREATE TRIGGER [dbo].[UpdateEC] 
       ON  [dbo].[TVAs]
       AFTER UPDATE
    AS 
    BEGIN
    	DECLARE @id int
    	SET @id = (SELECT IdEcriture FROM inserted)
    	INSERT INTO JournalLogs (Identifiant, Date, Action, IP, TypeEvent, TableCible, IdRow)
    	VALUES (ORIGINAL_LOGIN(), CURRENT_TIMESTAMP, ''UPDATE'', NULL, 1, ''TVAs'', @id)
    	SET NOCOUNT ON;
    END
    '
    EXEC(@SQL)
    Sa me retourne une erreur comme quoi IdEcriture n'est pas une colonne valide ! C'est logique, mais j'avoue ne pas savoir comment contourner sa...

    De même j'ai éssayé de les créer simplement, sans encapsuler ma requête dans une variable @SQL, mais concernant les triggers qui créé des variables pour fonctionner, il me retourne que ces variables existent déja... Comment scripter la création des triggers ? Créer un seul script par trigger et les éxécuter les uns apres les autres ? Sa résoudrait pas le problème de IdEcriture !

    HELP !

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

Discussions similaires

  1. [AC-2007] Problème avec des requêtes imbriquées
    Par triaguae dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 15/02/2011, 14h43
  2. Problème avec des requète imbriquée dans le from
    Par Stouille33 dans le forum Développement
    Réponses: 5
    Dernier message: 23/10/2008, 19h17
  3. Problème avec des sous requêtes
    Par nicocolt dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/10/2007, 15h19
  4. Réponses: 6
    Dernier message: 20/02/2007, 17h00
  5. Problème avec des requêtes
    Par yoda7666 dans le forum ASP
    Réponses: 13
    Dernier message: 09/03/2006, 18h16

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