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

Développement SQL Server Discussion :

Trigger avec variable dans une requete


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Février 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Février 2016
    Messages : 23
    Par défaut Trigger avec variable dans une requete
    Bonjour à tous,

    Je suis un problème de syntaxe dans mon trigger. Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    BEGIN
     
    declare @PINCODE as varchar(10);
    declare @PCVISVALIDE as varchar(10);
    declare @PCVNUM as varchar(50);
    declare @shell as varchar(8000);
    declare ins_cur cursor FAST_FORWARD for (select PCVNUM from inserted);
     
    declare @pcvnumcde as varchar(50);
    set @pcvnumcde = (SELECT PCVNUM from inserted);
     
     
    declare @numdevis as varchar(50);
    set @numdevis = (SELECT TOP (1) Entete_Devis.PCVNUM AS Numdevis FROM PIECEVENTELIGNES AS Ligne_Devis INNER JOIN
                             PIECEVENTES AS Entete_Devis ON Ligne_Devis.PCVID = Entete_Devis.PCVID INNER JOIN
                             PIECEVENTELIGNES AS Ligne_Cde ON Ligne_Devis.PLVID = Ligne_Cde.PLVIDORG INNER JOIN
                             PIECEVENTES AS Entete_CDE ON Ligne_Cde.PCVID = Entete_CDE.PCVID
    						 where Entete_CDE.PCVNUM=''+@pcvnumcde+'');
     
      IF UPDATE (PCVNUM)
      BEGIN  
    SELECT @PINCODE=I.PINCODE, @PCVNUM=I.PCVNUM FROM INSERTED I;
     
    IF @PINCODE = 'CDECLI' 
     
     
                      set @shell = 'echo ' + @numdevis + ';1''>> "H:\Site Web\Out\orders_in\"accepted' + @numdevis + '.csv';
    				  exec master..xp_cmdshell @shell;
     
                      				  end
    								  end;
    Si j'exécute ce trigger, je n'obtiens pas de fichier dans mon dossier. Par contre, si je mets le code suivant, j'obtiens un fichier mais avec comme nom ma requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    BEGIN
     
    declare @PINCODE as varchar(10);
    declare @PCVISVALIDE as varchar(10);
    declare @PCVNUM as varchar(50);
    declare @shell as varchar(8000);
    declare ins_cur cursor FAST_FORWARD for (select PCVNUM from inserted);
     
    declare @pcvnumcde as varchar(50);
    set @pcvnumcde = (SELECT PCVNUM from inserted);
     
     
    declare @numdevis as varchar(50);
    set @numdevis ='(SELECT TOP (1) Entete_Devis.PCVNUM AS Numdevis FROM PIECEVENTELIGNES AS Ligne_Devis INNER JOIN
                             PIECEVENTES AS Entete_Devis ON Ligne_Devis.PCVID = Entete_Devis.PCVID INNER JOIN
                             PIECEVENTELIGNES AS Ligne_Cde ON Ligne_Devis.PLVID = Ligne_Cde.PLVIDORG INNER JOIN
                             PIECEVENTES AS Entete_CDE ON Ligne_Cde.PCVID = Entete_CDE.PCVID
    						 where Entete_CDE.PCVNUM='''+@pcvnumcde+')';
     
     
      IF UPDATE (PCVNUM)
      BEGIN  
    SELECT @PINCODE=I.PINCODE, @PCVNUM=I.PCVNUM FROM INSERTED I;
     
    IF @PINCODE = 'CDECLI' 
     
     
                      set @shell = 'echo ' + @numdevis + ';1''>> "H:\Site Web\Out\orders_in\"accepted' + @numdevis + '.csv';
    				  exec master..xp_cmdshell @shell;
     
                      				  end
    								  end;
    Pourriez vous m'aider s'il vous plait?

    D'avance, merci.

    Julien

  2. #2
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Bonjour bonjour,

    Tout d'abord, si dans votre deuxième proposition vous avez la requête, c'est normal, vous traitez votre variable comme un string.

    Pour la première proposition, il vous faut adapter votre code. En effet, là vous ne remplacez pas votre variable par votre valeur. Il vous faut passer par du sql dynamique avec un bel exemple sur le lien suivant :
    https://blog.sqlauthority.com/2018/1...to-a-variable/

    Bisous bisous

  3. #3
    Membre averti
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Février 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Février 2016
    Messages : 23
    Par défaut
    Bonjour et merci pour votre aide,

    Tout d'abord, merci pour l'information concernant la seconde requête. Je n'avais pas vu que je traité le champ comme string.

    Concernant le sql dynamique, je ne savais. J'ai essayé d'utiliser l'exemple donnée mais ça ne marche toujours pas.

    Voici le code rectifié. Peux être aurez vous une idée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    BEGIN
     
    declare @PINCODE as varchar(10);
    declare @PCVISVALIDE as varchar(10);
    declare @PCVNUM as varchar(50);
    declare @shell as varchar(8000);
    declare ins_cur cursor FAST_FORWARD for (select PCVNUM from inserted);
     
     
    declare @sqlCommand as Nvarchar(4000);
    declare @numdevis as VARCHAR(50);
    declare @pcvnumcde as varchar(50);
    set @pcvnumcde = (SELECT PCVNUM from inserted);
     
     
    set @sqlCommand ='SELECT TOP (1) @numdevis = Entete_Devis.PCVNUM FROM PIECEVENTELIGNES AS Ligne_Devis INNER JOIN
                             PIECEVENTES AS Entete_Devis ON Ligne_Devis.PCVID = Entete_Devis.PCVID INNER JOIN
                             PIECEVENTELIGNES AS Ligne_Cde ON Ligne_Devis.PLVID = Ligne_Cde.PLVIDORG INNER JOIN
                             PIECEVENTES AS Entete_CDE ON Ligne_Cde.PCVID = Entete_CDE.PCVID
    						 where Entete_CDE.PCVNUM=@pcvnumcde';
     
    EXEC sp_executesql @sqlCommand, N'@pcvnumcde VARCHAR(50), @numdevis VARCHAR(50) OUTPUT',
    @pcvnumcde=@pcvnumcde, @numdevis=@numdevis OUTPUT
    SELECT @numdevis ReturnedName
      IF UPDATE (PCVNUM)
      BEGIN  
    SELECT @PINCODE=I.PINCODE, @PCVNUM=I.PCVNUM FROM INSERTED I;
     
    IF @PINCODE = 'CDECLI' 
     
                     /* set @shell = 'echo EP;' + @PCVNUM + '>> "\\192.168.1.9\data srvlx\Factures\"PDF' + @PCVNUM + '.txt';*/
                      set @shell = 'echo ' + @numdevis + ';1''>> "H:\Site Web\Out\orders_in\"accepted' + @pcvnumcde + '.csv';
    				  exec master..xp_cmdshell @shell;
     
                      				  end
    								  end;
    D'avance, merci.
    Cordialement
    Julien

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Pouvez vous expliquer fonctionnellement ce que vous cherchez à faire ?
    Parce que :
    • Les déclencheurs sont par nature ensembliste dans SQL Server alors que votre logique semble unitaire
    • il 'est pas d'usage de faire appel à un curseur dans un déclencheur, sauf à vouloir pourrir les performances
    • il 'est pas d'usage de faire appel à un processus externe (xp_cmdshell) dans un déclencheur, sauf à vouloir pourrir les performances et la sécurité


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre averti
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Février 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Février 2016
    Messages : 23
    Par défaut
    Bonsoir SQLpro,

    Tout d'abord merci pour votre réponse. Je vous explique donc en détail le besoin de ce déclencheur.

    La table sur laquelle agit ce déclencheur est une table de pièces de vente. ce déclencheur doit me générer un fichier (ou deux fichiers) de façon à mettre à jour mon site internet.

    Ce déclencheur doit au moment ou je transforme ma pièce de vente créer un (ou des) fichiers pour que mes clients puissent suivre l'avancement de leur devis/commande. Voici un exemple qui sera plus parlant :
    un client me passe une commande sur mon site internet. Mon site me donne un fichier qui est intégré via un automate de mon erp.
    J'intègre donc ce fichier en tant que devis dans mon logiciel. après accord par mon client, je transforme mon devis en commande. A ce moment là, j'ai besoin de générer un fichier qui, déposé sur le ftp de mon site, donne l'information que la commande est validée. (le déclencheur que j'essaye de faire)
    Lors de la transformation de ma commande en bon de livraison, j'ai besoin de deux fichiers : un qui, via mon automate, me permet de générer le bon de livraison en pdf et un autre qui , déposé sur le ftp de mon site, donne l'information et le fichier de la livraison de la commande.
    enfin, lors de la création de la facture, j'ai besoin de générer, de nouveau, deux fichiers comme pour la livraison pour la facture.

    Je suis conscient que la création ou l'utilisation de déclencheur sur sql serveur peut ralentir la base et les temps d'accès certaines transformation ne sont pas quotidiennes.

    Du coup, auriez vous une idée pour réaliser ces éléments sans que j'ai besoin d'intervenir (en dehors des actions dans l'ERP) ?

    D'avance, merci.

    Cordialement

    Julien

  6. #6
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    1) Votre ERP ne génère-t-il pas des événements lors d'un changement d'état ?

    2 )Serait-il envisageable de lors du trigger créer une entrée dans une tables et qu'un processus par polling (exemple ~10secondes) lise cette entrée et qu'il génère les fichiers adéquats ?

    3) Même que 2 mais l'information est mise dans une queue et le processus au lieu du polling lise cette dernière queue pour générer les fichiers ?

    4) Au lieu de générer les fichiers au changement d'état qu'ils soient générés au moment de la demande ?

    Je pense qu'il existe d'autres solutions alternatives... Ce ne sont que des pistes plus ou moins compliquées à mettre en œuvre.

Discussions similaires

  1. utilisation de variable dans une requete
    Par JUSTIN Loïc dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 26/07/2006, 08h40
  2. Souci avec une variable dans une requete
    Par polianita dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 21/06/2006, 17h05
  3. Variable dans une requete
    Par faayy dans le forum Access
    Réponses: 5
    Dernier message: 20/06/2005, 16h54
  4. PB avec MATCH dans une requete.
    Par pjl dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/04/2004, 11h18
  5. [syntaxe] Gerer les variables dans une requete
    Par rastapopulos dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 15/04/2003, 12h53

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