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

Administration SQL Server Discussion :

Contains() et les tables Information_schema


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 41
    Par défaut Contains() et les tables Information_schema
    Bonjour,

    J'ai sur ma base de données beaucoup de procédures stokées (2500 environ) et je voudrai savoir quelles sont les procédures qui font des inserts, des deletes, des updates.

    J'ai pensé à utiliser les tables systèmes comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select 
    	routine_name,
    	routine_definition 
    from 
    	information_schema.routines
    where 
    	routine_type='PROCEDURE'
     
    order by routine_name
    ce qui me sort la liste des procédures avec leur définition. Je voudrai éviter de me taper toutes ces procédure a la main et faire directement un contains() sur la définition ma procédure pour avoir un résultat rapide et complètement sûr.

    J'ai donc modifié ma requête comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select 
    	routine_name,
    	routine_definition 
    from 
    	information_schema.routines
    where 
    	routine_type='PROCEDURE'
    	and contains(routine_definition,' delete ')
    order by routine_name
    mais j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg*7601, Niveau*16, État*2, Ligne*1
    Impossible d'utiliser le prédicat CONTAINS ou FREETEXT sur table ou vue indexée 'information_schema.routines', car il n'y a pas d'index de texte intégral.
    Est-ce que quelqu'un à une idée pour contourner le problème?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 41
    Par défaut
    Voilà plus le résultat que j'aimerai obtenir (tout dans une seule requête):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select 
    	routine_name,
    	case when contains(routine_definition,' delete ') then '1' else '0' end as del,
    	case when contains(routine_definition,' update ') then '1' else '0' end as up,
    	case when contains(routine_definition,' insert ') then '1' else '0' end as ins
    from 
    	information_schema.routines
    where 
    	routine_type='PROCEDURE'
    order by routine_name
    Mais j'ai aussi la même erreur qu'avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Msg*7601, Niveau*16, État*2, Ligne*2
    Impossible d utiliser le prédicat CONTAINS ou FREETEXT 
    sur table ou vue indexée information_schema.routines, 
    car il n y a pas d index de texte intégral.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 41
    Par défaut
    Bon j'ai essayé de passer par syscomments et sysobjects mais ca fait exactement pareil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select  
    	name, 
    	text,
    	case when contains(text,' delete ') then '1' else '0' end as del,
    	case when contains(text,' update ') then '1' else '0' end as up,
    	case when contains(text,' insert ') then '1' else '0' end as ins
    from 
    	dbo.syscomments, 
    	dbo.sysobjects
    where 
    	syscomments.id = sysobjects.id
    	And sysobjects.xtype = 'P'
    La même erreur que je commence à avoir en horreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg*7601, Niveau*16, État*2, Ligne*1
    Impossible d'utiliser le prédicat CONTAINS ou FREETEXT sur table ou vue indexée 'dbo.syscomments', car il n'y a pas d'index de texte intégral.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 41
    Par défaut
    Bon ben je viens de trouver une façon de faire en utilisant le mot clé lilke
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select 
    	routine_name,
    	routine_definition,
    	case when  routine_definition like '%delete%' then '1' else '0' end as del,
    	case when  routine_definition like '%update%' then '1' else '0' end as up,
    	case when  routine_definition like '%insert%' then '1' else '0' end as ins,
    	case when  routine_definition like '%select%' then '1' else '0' end as sel
    from 
    	information_schema.routines
    where 
    	routine_type='PROCEDURE'
    order by routine_name
    Ca fonctionnne sans erreur et me donne un résultat correct dans un temps respectable. J'ai pas encore véritable compris pourquoi l'unmarche et pas l'autre, je vais essayer de faire des recherches dès que j'ai le temps.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    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 : 22 001
    Billets dans le blog
    6
    Par défaut
    CONTAINS et FREETEXT ne peuvent être invoqué que si vous avez préalablement mis en place un catalogue d'indexation textuel, ce qui est impossible sur des vues de méta donné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/ * * * * *

  6. #6
    Membre chevronné Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Par défaut Attention aux procédures de plus de 4000 caractères !
    Bonsoir,

    information_schema.routines.routine_definition est un nvarchar(4000),
    si vous avez des procédures stockées de plus de 4000 caractères, il est possible que vous ne trouviez pas toutes les références que vous cherchez, puisque seul
    le début de votre procédure stockée pourra être stocké dans 4000 caractères.

    Sous 2005, 2008. Utilisez plutôt sys.sql_modules.definition qui est de type nvarchar(max)

    @+

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

Discussions similaires

  1. [2005] Lister les tables information_schema.tables entre deux dates
    Par chriphil dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 11/09/2014, 15h08
  2. [SQL Server]La liste de toutes les tables
    Par Husqvarna dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/09/2008, 16h21
  3. [ODBC] Intranet en PHP : Lister les tables d'une base Access
    Par fblouet dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/10/2003, 14h46
  4. Lister les tables d'une Base
    Par YanK dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 08/10/2003, 10h40
  5. Sélection de toute les tables d'une base
    Par lord_paco dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 21/07/2003, 14h56

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