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 :

Chercher occurence dans base sql serveur 2000


Sujet :

MS SQL Server

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Chercher occurence dans base sql serveur 2000
    Bonjour à tous, je m'adresse à vous car je bosse sous sql serveur 2000 et mon patron m'a demandé de développer un bout de code en transact sql dont le but est de lister tous les endroits d'une base (tables + colonnes) où se trouve une occurence.

    Hors moi, en transact sql c'est pas sa. SQL pourquoi pas mais c'est mon premier travail à plein temps (depuis 3 mois) et Transact SQL je comprends une fois qu'il est écrit mais de là à le taper moi même ya une marge.

    C'est pourquoi j'ai fortement besoin de votre aide.

    J'ai récupéré un code qui m'a l'air d'être mieux que pas mal (voir plus bas ou http://sqlpro.developpez.com/cours/s...r/transactsql/
    -- paragraphe 4.3)

    Maintenant, j'aimerais savoir ce que j'en fais de ce code. Ma coupable ignorance m'a poussé jusqu'à le copier coller dans une procédure stockée au sein de ma base et de l' exécuter bien sur. Donc, le seul résultat que j'en ai obtenu est "la ou les commande(s) ont réussi".Cool, sa me fais une belle jambe (bien que j'en déduise que la syntaxe doit pas être pourrie).

    Donc, si quelqu'un pouvais m'éclairer, m'orienter ou même confirmer/infirmer que ce code correspond à ce que je recherche, en bref répondre, ce serait super cool de sa part.

    Sur ce, bonne journée les développeurs.

    voivi le code en question:

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
     SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS OFF 
    GO
     
    /*---------------------------------------------------\
    | recherche d'une occurrence de mot dans n'importe     |
    | quelle colonne de type caractères de n'importe       |
    | quelle table de la base de données                   | 
    |----------------------------------------------------- |
    | Frédéric BROUARD - COMMUNICATIC SA - 2001-12-18      |
     \-------------------------------------------------- */
     
    ALTER     PROCEDURE SP_SEARCH_STRING_ANYFIELD_ANYTABLE
                     @SearchWord Varchar(32)      -- mot recherché
     
    AS 
     
    DECLARE @ErrMsg VARCHAR(128),
            @TableName Varchar(128),   -- nom de la table passé en argument
            @ColumnList1 VARCHAR(2000),-- liste des colonnes pour clause SELECT
            @ColumnList2 VARCHAR(2000),-- liste des colonnes pour clause WHERE
            @SQL         VARCHAR(5000) -- requête dynamique 
     
    IF @TableName IS NULL OR @SearchWord IS NULL
    RAISERROR ('Paramètres NULL impossible à traiter', 16, 1)
    IF @@ERROR <> 0 GOTO LBL_ERROR
     
    -- test d'existence de la table
    IF NOT EXISTS(SELECT *
                  FROM   INFORMATION_SCHEMA.tables 
                  WHERE  TABLE_NAME = @TableName)
    RAISERROR ('Références de table inconnue %s', 16, 1, @TableName)
    IF @@ERROR <> 0 GOTO LBL_ERROR
     
    Declare @ColumnList varchar(1000)   -- liste des noms de colonnes dans 
                                        -- lesquels la recherche va s'effectuer 
     
    -- obtention de la liste des colonnes pour la requête de recherche
    SELECT @ColumnList = COALESCE(@ColumnList + ' + COALESCE(', 'COALESCE(') + column_name +', '''')'
    FROM   INFORMATION_SCHEMA.COLUMNS
    WHERE  TABLE_NAME = @TableName
      AND  DATA_TYPE LIKE '%char%'
     
    IF @ColumnList IS NULL
    RAISERROR ('Aucune colonne de recherche trouvé dans la table %s',
               16, 1, @TableName)
    IF @@ERROR <> 0 GOTO LBL_ERROR
     
    PRINT 'INFO - @ColumnList value is : ' + @ColumnList
     
    -- assemblage du texte de la requête de recherche 
    Set @SQL = 
       'SELECT * FROM '+ @TableName 
     + ' WHERE '       + @ColumnList 
     + ' LIKE ''%'     + @SearchWord +'%'''
     
    PRINT 'INFO - @SQL value is : ' + @SQL
     
    -- exécution de la requête de recherche
    Exec (@SQL)
     
    RETURN
     
    --------------------------------------------------------------------------------------
    -- effet de bord 1 : pas de mot passé
    IF @SearchWord IS NULL
    BEGIN
       SET @ErrMsg = 'Impossible de traiter cette recherche avec un argument NULL'
       GOTO LBL_ERROR 
    END
     
    -- effet de bord 2 : mot vide passé
    IF @SearchWord = ''
    BEGIN
       SET @ErrMsg = 'Impossible de traiter cette recherche avec un argument vide'
       GOTO LBL_ERROR 
    END
     
    -- effet de bord 3 : mot contenant un caractère joker % du LIKE
    IF CHARINDEX('%', @SearchWord) > 0
    BEGIN
       SET @ErrMsg = 'Impossible de traiter cette recherche avec un argument contenant un caractère %'
       GOTO LBL_ERROR 
    END
     
    -- effet de bord 4 : mot contenant un caractère joker _ du LIKE
    IF CHARINDEX('_', @SearchWord) > 0
    BEGIN
       SET @ErrMsg = 'Impossible de traiter cette recherche avec un argument contenant un caractère _'
       GOTO LBL_ERROR 
    END
     
    -- curseur parcourant toutes les tables
    DECLARE CurTables CURSOR
    FOR 
       SELECT DISTINCT TABLE_NAME
       FROM   INFORMATION_SCHEMA.tables
       WHERE  TABLE_TYPE = 'BASE TABLE'
         AND  TABLE_NAME IS NOT NULL
    -- en cas d'erreur
    IF @@Error <> 0
    BEGIN
       SET  @ErrMsg = 'Erreur dans la recherche de la liste des tables concernées'
       GOTO LBL_ERROR 
    END
     
    -- ouverture du cuseur
    OPEN CurTables
     
    -- lecture de la première ligne de l'ensemble de résultat
    FETCH CurTables INTO @TableName
     
    -- la lecture est-elle correcte ? Oui, on boucle !
    WHILE @@Fetch_Status = 0
    BEGIN
     
    -- les variables contenant les listes des colonnes sont initialisée à vide
       SET @ColumnList1 = ''
       SET @ColumnList2 = ''
     
    -- construction des listes
       SELECT @ColumnList1 = @ColumnList1 + COLUMN_NAME+', ',
              @ColumnList2 = @ColumnList2 + 'COALESCE('+COLUMN_NAME+', '''') + '
       FROM   INFORMATION_SCHEMA.COLUMNS
       WHERE  TABLE_NAME = @tableName
         AND  DATA_TYPE LIKE '%char%'
     
    -- pas de colonnes cible pour la recherche, on lit l'enregistrement suivant et on boucle
       IF @ColumnList1 = ''
       BEGIN
          FETCH CurTables INTO @TableName
          CONTINUE
       END
     
    -- suppression du dernier caractère parasite des listes de colonne 
       SET @ColumnList1 = SUBSTRING(@ColumnList1, 1, LEN(@ColumnList1) - 1)
       SET @ColumnList2 = SUBSTRING(@ColumnList2, 1, LEN(@ColumnList2) - 1)
     
    -- création de la requête de recherche de l'ensemble des occurences
       SET @SQL = 'SELECT ' +@ColumnList1
                +' FROM '   +@TableName
                +' WHERE '  +@ColumnList2
                +' LIKE ''%'+@SearchWord+'%'''
     
    -- exécution de la requête de recherche des occurences
       EXEC(@SQL)
     
    -- lecture de la ligne suivante
       FETCH CurTables INTO @TableName
    END
     
    -- fermeture du curseur
    CLOSE CurTables
     
    -- libération de l'espace mémoire
    DEALLOCATE CurTables
     
    PRINT '*** RECHERCHE de l''occurence '+@SearchWord+ ' dans toute la base terminée ***'
     
    RETURN
     
    -- gestion des erreurs
    LBL_ERROR:
    PRINT 'ERREUR LORS DE L''EXÉCUTION DE LA PROCÉDURE STOCKÉE SP_SEARCH_STRING_ANYFIELD'
     
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Bonjour,

    Précision: est-ce que tu cherches une valeur dans les données, ou un nom de métadonnées (comme nom de colonne) ?
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3
    Points : 1
    Points
    1
    Par défaut re: précision
    Bonjour Rudi,

    tout d'abord je tiens à te féliciter pour la rapidité de ta réponse. Je m'attendais à te voir pointer le bout de ton nez sur ce sujet, mais si rapidemment, tu me bluffes.

    Sinon, je cherche une valeur dans la base de données et non un nom de colonne ou de table (sinon, j'aurais utiliser l'outil que tu m'as montré la dernière fois et dont je me sers sans compter).

    En fait, ce serait le type de procédure qui moulinerai pendant 2 heures et qui chercherai à ma place.

    Exemple, sur la fusion (qui s'est très bien déroulée, je te remercie encore à ce sujet, et pour tout ce que j'ai appris lors de notre dernère rencontre), je rentre 'DOLI...' et au bout de 2 heures, sa me sors tous les endroits où se trouvent cette occurence.

    Par ailleurs, j'ai eu une réponse du MP que j'ai envoyé à SQLpro, qui m'a répondu d'ajouter un argument à cette procédure lors de son exécution: exec MaProcedure 'toto'.

    Donc, j'ai essayé et sa ne marche pas. L'analyseur de requête considère que l'argument a une valeur NULL. Pourtant, j'ai fait plusieurs essais avec plusieurs variantes et toujours le même message.

    Je pense que l'on est proche de la solution, et avec ton aide sa ne devrait pas poser de problèpme.

    A bientot, cordialement,

    Antoine

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Salut Antoine,

    Bonne idée de passer par développez, ça aide tout le monde.
    En jetant un oeil dans la procédure que tu utilises, je vois un problème : il manque un paramètre pour spécifier la table. Elle ne cherche que dans une table qu'il faut spécifier. Peut-être y a-t-il plus d'infos dans l'article ?

    Il existe une autre procédure qui fait la même chose : http://vyaskn.tripod.com/search_all_...all_tables.htm
    Essaie celle-là.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3
    Points : 1
    Points
    1
    Par défaut merci
    Super,

    sa a l'air de marcher. Puis venant de toi je suis rassuré sur la qualité du code. en effet, je connais ton amour pour l'utilisation des curseurs en sql et dans la procédure que j'avais trouvé il y en avait. De plus,la taille de la procédure est divisée par 2, ce qui est bon signe en général.

    Je t'adresse un grand merci pour ta rapidité et ton aide.

    Cordialement,

    Antoine

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/01/2009, 11h31
  2. Attachement base (sql serveur 2000)
    Par Domi34 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 05/12/2007, 10h30
  3. SQL-SERVEUR 2000 [debutant] connexion à la base
    Par ducho dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 17/03/2006, 10h05
  4. Recreer les indexs de table dans SQL serveur 2000
    Par FilipeVV dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/03/2006, 15h30
  5. taille max des bases sur sql serveur 2000
    Par timsah dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 15/02/2006, 16h07

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