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 :

Utilisation fonction sys.fn_get_sql


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Utilisation fonction sys.fn_get_sql
    Bonjour,

    J'essaie d'utiliser la fonction sys.fn_get_sql dans la requête ci-dessous :

    SELECT (SELECT text FROM sys.fn_get_sql(sql_handle))
    FROM master.dbo.sysprocesses

    Sur un serveur SQL Server 2005, elle fonctionne bien, par contre sous un SQL Server 2000, j'obtiens le message d'erreur :

    Serveur*: Msg 155, Niveau 15, État 1, Ligne 1
    'sql_handle' n'est pas une option OPTIMIZER LOCK HINTS reconnue.

    Quelqu'un aurait une idée ?

    Merci d'avance

  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,

    Ces fonctions ne sont disponibles que sous SQL Server 2005.
    En SQL Server 2000 vous pouvez requêter la table sys.sysprocesses, mais en SQL Server 2005 il sera mieux de requêter avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM sys.dm_exec_sessions ES (nolock)
    JOIN sys.dm_exec_connections (nolock) EC ON ES.session_id = EC.session_id
    JOIN sys.dm_exec_requests ER (nolock) ON ES.session_id = ER.session_id
    Je vous laisse le choix des colonnes et des contraintes
    La table sys.sysprocesses est conservée dans SQL Server 2005 seulement pour la compatibilité.

    La seule façon je crois de récupérer le texte d'une requête SQL en cours d'exécution sous SQL Server 2000 reste le Profiler ...

    @++

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Re-bonjour,

    Effectivement, la présence de sysprocesses dans SQL Server 2005 est dûe purement à des raisons de compatibilité. Au passage, merci pour les syntaxes "pures" SQL 2005, que je ne m'étais pas donné la peine de chercher

    Par contre, la fonction sys.fn_get_sql, qui est présente aussi bien dans SQL 2005 que 2000, ne semble fonctionner avec la syntaxe pré-citée qu'en SQL 2005. Hors, son existence dans SQL 2005 s'explique uniquement pour des raisons de compatibilité, car elle est remplacée par sys.dm_exec_sql_text.
    Si on opère l'opération avec le code ci-dessous, on parvient à nos fins, mais cela n'est pas satisfaisant pour l'utilisation que je souhaite en faire :

    --DECLARE @Variable AS VARBINARY(64) -- Sous SQL 2005
    DECLARE @Variable AS BINARY(20) -- Sous SQL 2000

    SELECT @Variable = sql_handle
    FROM master.dbo.sysprocesses
    WHERE spid = 172 -- spid d'un des process

    SELECT text FROM ::fn_get_sql(@Variable)

    On voit ici qu'on effectue donc deux requêtes au lieu d'une, et qu'on est obligés de déclarer une variable. Pire, si on voulait avoir le code de tous les process, il faudrait effectuer une boucle. J'aimerais pouvoir récupérer de manière cohérente la liste des process bloqués, avec le code SQL qui s'y rattache, et ce de manière "transactionnelle" comme je procède avec ma requête d'origine.

  4. #4
    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,

    J'ai oublié un morceau de la liste des tables dans les jointures que je vous ai données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FROM sys.dm_exec_sessions ES (nolock)
    JOIN sys.dm_exec_connections (nolock) EC ON ES.session_id = EC.session_id
    JOIN sys.dm_exec_requests ER (nolock) ON ES.session_id = ER.session_id
    CROSS APPLY sys.dm_exec_sql_text(ER.sql_handle) ESQLT
    Sous SQL Server 2000, vous pouvez faire avec DBCC INPUTBUFFER.
    Pour trouver les processus bloqués, cherchez si la colonne blocked de sys.sysprocesses est différente de 0.
    Ajoutez aussi une contrainte sur le SPID : s'il est inférieur à 50, ce sont des processus système.

    @++

Discussions similaires

  1. [Fortran 77 / VMS] Utilisation fonction systeme SYS$TIMCON
    Par Bergonzoli dans le forum Fortran
    Réponses: 4
    Dernier message: 01/08/2008, 15h58
  2. Réponses: 6
    Dernier message: 24/02/2005, 09h44
  3. [GIMP] [Script-FU] Utilisation fonction gimp-curves-spline
    Par narmataru dans le forum Autres langages
    Réponses: 1
    Dernier message: 09/02/2005, 17h25
  4. [Débutant] Aide utilisation fonctions :(
    Par trakiss dans le forum Débuter
    Réponses: 10
    Dernier message: 27/08/2004, 15h59
  5. Utilisation fonction définie dans un .Dll
    Par jeab. dans le forum Windows
    Réponses: 5
    Dernier message: 23/03/2004, 16h23

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