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 :

Exceptions dans le profiler sur des procedures stockées [2012]


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut Exceptions dans le profiler sur des procedures stockées
    Bonjour,

    Nous avons actuellement un serveur de production sous SQL Server 2012 SP2 (11.0.5058) sur un serveur 2012.
    Ce serveur héberge la base de données de production qui est au niveau de compatibilité 110 (la plus haute)

    Pour accéder aux données, nous utilisons exclusivement des procédures stockées ne contenant qu'un seul statement (insert, update, delete ou select). Chaque procédure peut néanmoins contenir de nombreux CTE.

    L'application fonctionne correctement mais j'ai remarqué dans le profiler que le serveur lance une exception Error 156 Sev 15 à chaque fois qu'une procédure d'insert ou d'update est exécutée....
    L'exception est :
    "Syntaxe incorrecte vers le mot clef 'XXXX'"

    Où XXXX est UPDATE ou INSERT (je n'ai pas capturé de DELETE dans la trace)

    Or la commande est belle et bien exécutée correctement.....
    Ci joint la trace obtenue


    Et la requete qui est surlignée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE PROCEDURE [dbo].[Arche_UpdateEmplacement_100]
    					@NO_EMPLACEMENT	INT	
    AS
    	UPDATE
    		[TraceTri].[EMPLACEMENT]
    	SET
    		DATE_AFFECTATION = GETDATE()
    	WHERE
    		NO_EMPLACEMENT = @NO_EMPLACEMENT
     
    GO
    Merci pour votre aide

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Il vous faut rajouter l'événement Exception de la catégorie Errors and Warnings

    @++

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Il vous faut rajouter l'événement Exception de la catégorie Errors and Warnings

    @++

    Merci pour votre réponse,

    mais je ne la comprend pas ou bien je ne sais pas de quoi vous parlez. Il me semble que c'est justement cette catégorie que j'ai affiché dans ma copie d'écran. elle est donc bien dans la trace. A moins que vous ne fassiez allusion à autre chose que je ne connais pas.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Novembre 2014
    Messages : 815
    Points : 1 350
    Points
    1 350
    Billets dans le blog
    2
    Par défaut
    ouvrir Profiler.
    Sur la Outils menu, cliquez sur sélection des événements puis cocher l'option Afficher tous les événements
    cliquer Sur onglet Eventslog, cocher l'option "Error and Warning"
    Images attachées Images attachées  

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Alors nous parlons bien de la même chose.

    Et c'est bien ce que j'ai fait puisque sur la copie d'écran que j'ai mise, on voit bien les exceptions
    (sous entendu que si on les ajoute pas, on ne les voit pas ! )

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Alors comme cela n'a pas l'air d'être clair dans mon premier message, je précise ce qui se passe :

    J'utilise le profiler pour traquer les exceptions (en ajoutant bien cette classe d'évènements hein ) et je vois que j'en ait beaucoup. Or l'application qui execute les procédures et qui accède à la base ne voit pas d'exception, la requête est correctement exécutée, et compte tenu de sa simplicité, je ne vois pas ce qui pourrai provoquer cela.....

    Des idées ?

  7. #7
    Membre expérimenté

    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Novembre 2014
    Messages : 815
    Points : 1 350
    Points
    1 350
    Billets dans le blog
    2
    Par défaut
    est ce que je peut avoir la totalité du message qui s’apparaît dans le textdata "Syntaxe incorrecte vers le mot clef 'XXXX'"

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par abdallah_mehdoini Voir le message
    est ce que je peut avoir la totalité du message qui s’apparaît dans le textdata "Syntaxe incorrecte vers le mot clef 'XXXX'"
    He bien il n'y a rien d'autre.... juste ce que l'on voit dans la trace.

    J'ai oublié de préciser que le SQL est en version standard

    et pour être vraiment complet, voici le definition de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE [TraceTri].[EMPLACEMENT](
    	[NO_EMPLACEMENT] [INT] NOT NULL,
    	[DATE_CREATION] [DATETIME] NOT NULL,
    	[CODE_EMPLACEMENT] [VARCHAR](50) NOT NULL,
    	[LIBELLE] [VARCHAR](50) NULL,
    	[DATE_AFFECTATION] [DATETIME] NULL
     CONSTRAINT [PK_EMPLACEMENT] PRIMARY KEY CLUSTERED 
    (
    	[NO_EMPLACEMENT] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

  9. #9
    Membre expérimenté

    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Novembre 2014
    Messages : 815
    Points : 1 350
    Points
    1 350
    Billets dans le blog
    2
    Par défaut
    a Chaque fois que vous obtenez une syntaxe incorrecte l'exception s’apparaît , il est préférable d'aller et attentivement votre code et vérifier que toutes les déclarations sont bien formés et complète. Habituellement,je ne peux pas vous aider sans le syntaxe correcte pour l'opération qui commence par insert (voir le profiler) , car il est très spécifique à votre code. Une bonne approche pour trouver la faute est pour localiser le point de l'erreur

  10. #10
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Alternativement, vous pouvez encadrer la requête en question d'un contrôle TRY et d'une transaction explicite. Par exemple :

    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
    BEGIN TRY;
    	BEGIN TRANSACTION;
    		<votre requête>
    	ROLLBACK TRANSACTION;
    END TRY;
    BEGIN CATCH;
    	DECLARE @err_msg nvarchar(2048) = ERROR_MESSAGE();
    		, @err_num int = ERROR_NUMBER();
    		, @err_stt int = ERROR_STATE();
     
    	IF XACT_STATE() <> 0;
    	BEGIN;
    		ROLLBACK TRANSACTION;
    	END;
     
    	THROW @err_num, @err_msg, @err_stt;
    END CATCH;
    De cette façon vous pouvez rejouer la requête pour voir où elle plante précisément.
    Si elle vient à s’exécuter sans lever une exception, les modifications qu'elle aura entrainé seront annulées.

    @++

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    1) utilisez vous le réplication de données ?
    2) utilisez vous des colonnes ayant pour type TIMESTAMP ?
    3) quel est la valeur de @@OPTIONS ?
    4) vos bases de données système sont-elles au même niveau de compatibilité ?
    5) avez-vous plusieurs instances de SQL Server sur cette machine ?
    6) quel est la collation du serveur et de la base de production ?
    7) avec quel outil avez vous édité vos procédures stockées ?

    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/ * * * * *

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Bonjour

    Citation Envoyé par SQLpro Voir le message
    1) utilisez vous le réplication de données ?
    2) utilisez vous des colonnes ayant pour type TIMESTAMP ?
    3) quel est la valeur de @@OPTIONS ?
    4) vos bases de données système sont-elles au même niveau de compatibilité ?
    5) avez-vous plusieurs instances de SQL Server sur cette machine ?
    6) quel est la collation du serveur et de la base de production ?
    7) avec quel outil avez vous édité vos procédures stockées ?

    A +
    1 : Oui. Réplication transactionnelle vers un autre serveur. L'erreur se produit sur le serveur de distribution (on est en mode push)
    2 : non
    3 : il me semble que les options peuvent être différentes pour chaque connexion.
    J'ai capturé les connexions avec le profiler et sur toutes les options sont les mêmes :
    -- network protocol: TCP/IP
    set quoted_identifier on
    set arithabort off
    set numeric_roundabort off
    set ansi_warnings on
    set ansi_padding on
    set ansi_nulls on
    set concat_null_yields_null on
    set cursor_close_on_commit off
    set implicit_transactions off
    set language Français
    set dateformat dmy
    set datefirst 1
    set transaction isolation level read committed


    4 : toutes les bases du serveur sont en niveau 120 SAUF la base distribution qui est en 90 (je n'ai aucune idée du pourquoi)
    5 : non
    6 : La collation est identique partout (bases système et la base de production) : French_CI_AS
    7 : SSMS mais elles sont généralement codées en local puis transférées sur le serveur. Je ne sais pas comment vérifier si on a un problème d'encodage du fichier de départ....


    Sur le serveur, nous avons de nombreux programmes connectés à la base. Seuls trois provoquent ces erreurs. De plus tous utilisent la même DLL pour l'accès à la base. Je cherche encore du coté du code, mais je ne vois pas de différence.....

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Je vais tester cela sur un exemple. Je pense pouvoir faire cela dans la journée.

    Merci

  14. #14
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il est possible aussi que ce soit l'applicatif qui, après appel des procédures stockées, lance une commande mal formée.
    Car visiblement, les SP tournent bien et les exceptions surviennent après.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Oui c'est possible, mais dans ce cas, pourquoi est ce que je ne la vois pas dans le profiler ?

  16. #16
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    cela dépend des évènements que vous profilez.
    s'il vous ne profilez que les SP mais que la requête est exécutée directement, il est normal que vous ne la voyiez pas.

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Alternativement, vous pouvez encadrer la requête en question d'un contrôle TRY et d'une transaction explicite. Par exemple :

    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
    BEGIN TRY;
    	BEGIN TRANSACTION;
    		<votre requête>
    	ROLLBACK TRANSACTION;
    END TRY;
    BEGIN CATCH;
    	DECLARE @err_msg nvarchar(2048) = ERROR_MESSAGE();
    		, @err_num int = ERROR_NUMBER();
    		, @err_stt int = ERROR_STATE();
     
    	IF XACT_STATE() <> 0;
    	BEGIN;
    		ROLLBACK TRANSACTION;
    	END;
     
    	THROW @err_num, @err_msg, @err_stt;
    END CATCH;
    De cette façon vous pouvez rejouer la requête pour voir où elle plante précisément.
    Si elle vient à s’exécuter sans lever une exception, les modifications qu'elle aura entrainé seront annulées.

    @++
    Alors j'ai essayé votre requête (en corrigeant le premier rollback en un commit) et j'ai eu le message :

    'Syntaxe incorrecte vers 'begin'

    Donc quelle que soit l'instruction, l’exception est lancée

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Bon, j'ai finalement trouvé la cause alors je m'auto répond,

    peut être que vous saurez m'expliquer le pourquoi :

    Nos applications sont écrites en Qt4 et utilisent ODBC pour se connecter à la base.

    L'erreur vient du type de curseur utilisé avant l'appel à la requête. Chaque appel à SQLExecDirectW est précédé d'un SQLSetStmtAttrW
    avec comme paramètre SQL_ATTR_CURSOR_TYPE = SQL_CURSOR_STATIC ce qui provoque une erreur

    Lorsqu'au contraire, j'effectue l'appel à SQLSetStmtAttrW avec SQL_ATTR_CURSOR_TYPE = SQL_CURSOR_FORWARD_ONLY
    dans ce cas je n'ai pas d'erreur.

    J'ai regardé la documentation des deux fonctions, et je n'ai pas trouvé clairement qu'il était interdit d'avoir un curseur statique pour un update... mais je comprend la logique.

    Voila, en espérant que cela vienne en aide à quelqu'un..

    A+

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/08/2007, 17h17
  2. implementer des procedures stockées dans du java
    Par stardeus dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 29/05/2007, 13h39
  3. Réponses: 2
    Dernier message: 24/03/2006, 09h55
  4. Impossible de créer des procedures stockée ==> ERREUR 106
    Par JMS_PCO dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 27/02/2006, 17h33
  5. Autorisations des procedures stockées
    Par Devilcat20 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 19/08/2005, 09h14

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