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 :

[SQL2000] Comment détecter un avertissement ?


Sujet :

MS SQL Server

  1. #1
    Membre actif Avatar de David.V
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2004
    Messages : 191
    Points : 203
    Points
    203
    Par défaut [SQL2000] Comment détecter un avertissement ?
    Salut tout le monde,

    tout est dans le titre ! Les erreurs, ok, suffit de tester @@ERROR. Mais aprés m'être documenté et avoir testé, il semble que cette variable système ne retourne rien concernant les avertissements.Comment peut on faire pour repérer les avertissements depuis une procédure stockée ?

    Mon problème est le suivant : j'ai un programme vb.net qui lance une PS sur le serveur. Et naturellement je récupère les eventuelles exceptions qui peuvent survenir durant la procédure. Mais j'ai un avertissement (sans gravité pour moi) qui est généré depuis la PS et qui est rattrapé par le programme. Mon programme est donc arreté, mais la PS tourne toujours sur le serveur

    Une idée ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    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 848
    Points : 52 964
    Points
    52 964
    Billets dans le blog
    6
    Par défaut
    Toute procédure stockée retourne dans sa variable de retour un code d'erreur qui est en fait le n° d'erreur dans le table des messages.
    Il suffit donc de récupérer cette info et d'aller capturer le message dans la table.
    Ce paramètre est le paramètre 0 du tableau de paramètres des PS dans ton code.
    Pour récupérer un message d'erreur, faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ...
    FROM master.dbo.sys.messages
    WHERE error = ?
    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/ * * * * *

  3. #3
    Membre actif Avatar de David.V
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2004
    Messages : 191
    Points : 203
    Points
    203
    Par défaut
    Merci de ton intervention

    Je suis d'accord avec tout cela, mais c'est pas ça mon problème. Habituellement, sur mes requetes, je teste si une erreur est survenu de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE TableTruc SET champ1=valeur....
    IF @@ERROR<>0
    GOTO ERREUR
    Dans un des mes traitements, j'utilise un serveur lié. Et pour recopier une base sur depuis ce serveur, je lui indique de déconnecter la base au préalable. Or dans cette opération, j'ai un avertissement qui m'est signalé (erreur SQL 5060) :

    "Les transactions non qualifiées sont annulées. Fin de l'opération (estimation) : 100%." .
    Or ce message n'est pas bloquant, la PS continue de tourner. Mais mon programme lui intercepte l'exception qui est levée et lui s'arrete. Ce que je voudrais donc, c'est que dans ma PS je puisse tester, d'une façon ou d'une autre juste aprés mon traitement sensible, si un avertissement est envoyé afin de tout arreter. Est-ce que je suis clair ?

  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 848
    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 848
    Points : 52 964
    Points
    52 964
    Billets dans le blog
    6
    Par défaut
    Avec le code, ce serait mieux !

    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 actif Avatar de David.V
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2004
    Messages : 191
    Points : 203
    Points
    203
    Par défaut
    Pas évident de donner du code car le tout fait parti d'un processus assez complexe. Enfin je vais essayer de reproduire au plus simple ce que je fait :

    J'ai 2 serveurs SQL (S1 et S2 admettont). Le serveur S1 doit recopier une base (que l'on nomme ici baseToto) de S2 vers S1 en executant une procédure stockée (qu'on appellera PS1), mais pour cela il doit la déconnecter et la détacher (avec l'aide d'un serveur lié) en appellant une procédure de déconnexion (qu'on appellera PS2) sur le serveur S2.

    Voila grosso modo un bout du code de PS1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    EXEC sp_addlinkedserver 'S2',N'SQL Server'
     
    exec S2.master.DBO.PS2 'baseToto'
     
    ...
    Suite du process
    ...
     
    FIN:
    EXEC sp_dropserver  'S2'
    et à quoi ressemble ma procédure PS2 sur l'autre serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE PROCEDURE PS2
    (
    	@DATABASE	VARCHAR(100)
    ) 
    As 
     
    DECLARE @strString  VARCHAR(1000)
     
    SELECT @strString = 'ALTER DATABASE ' +  @DATABASE + ' SET OFFLINE  WITH ROLLBACK IMMEDIATE '
    EXEC (@strString)
    GO

    Ce truc là marche trés bien tant que ma baseToto est inutilisée. En revanche, dès qu'une connexion est ouverte dessus, le 'alter database' déconnecte la base mais en retournant un avertissement ""Les transactions non qualifiées sont annulées. Fin de l'opération (estimation) : 100%.". Le problème n'est pas qu'il y ait un avertissement, mais qu'il est rattrapé par mon programme qui s'arrete. Or l'avertissemet étant non bloquant sur SQL, la procédure elle tourne toujours.

    Ce que j'aimerais, c'est avoir un test à cet endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    EXEC sp_addlinkedserver 'S2',N'SQL Server'
    
    exec S2.master.DBO.PS2 'baseToto'
    
    -- JE VEUX UN TEST ICI QUI RATTRAPE UN EVENTUEL AVERTISSEMENT ET QUI STOPPERAIT LA PS LE CAS ECHEANT EN SAUTANT VERS LE LABEL FIN
    
    ...
    Suite du process
    ...
    
    FIN:
    EXEC sp_dropserver  'S2'
    Est-ce possible ?

    Je pense que je peux pas être plus clair là .

  6. #6
    Membre actif Avatar de David.V
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2004
    Messages : 191
    Points : 203
    Points
    203
    Par défaut
    J'ai pu résoudre mon problème. J'ai pas le temps d'expliquer ici comment j'ai procédé, mais si ça intéresse quelqu'un, je veux bien faire ça quand j'ai un moment

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

Discussions similaires

  1. comment détecter les faces d'un mur
    Par einegel dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/01/2005, 23h12
  2. [Langue Clavier] Comment détecter le changement de la langue ?
    Par Fares BELHAOUAS dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 30/09/2004, 19h26
  3. Comment détecter un changement du réglage de voume sonore ?
    Par mjlub dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 09/01/2004, 17h43
  4. Comment détecter la frappe d'une touche ?
    Par Bubonik software dans le forum C
    Réponses: 17
    Dernier message: 11/12/2003, 21h52
  5. Réponses: 9
    Dernier message: 01/10/2003, 18h43

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