begin process at 2010 03 14 08:58:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Procédure

 > SQL SERVER 2005 : RECHERCHE DE CHAMPS PAR LEURS NOMS MULTI BASES DE DONNÉES

SQL SERVER 2005 : RECHERCHE DE CHAMPS PAR LEURS NOMS MULTI BASES DE DONNÉES


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Procédure Classé sous :sqlserver, recherche, nom, multibase, champ Niveau :Initié Date de création :08/04/2007 Date de mise à jour :12/04/2007 21:35:32 Vu :6 158

Auteur : skweeky

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note


 Description

Pour SQL Server 2005 uniquement. Permet de rechercher un champ par son nom dans toutes les bases de données d'une instance de SQL Server 2005.
Renvoie une table contenant le nom et l'id de la base de données, le nom et l'id du schéma, le nom et l'id de l'objet et idem pour le champ.

Il est possible de filtrer la recherche avec les 4 derniers critères.

le premier est le texte recherché (attention c'est un LIKE '%xxxx%' on recherche donc une portion de la châine du nom du champ

Les 3 suivant permettent de renvoyer ou non certains objets (une table est un des objets existant, tout comme l une vue, une procédure stockées).
@TableUniquement - Si 1 Renvoie uniquement les objets de type table
@ObjetSysteme - Si 0 ne renvoie pas les objets systèmes (ceux taggés ms_shipped)
@ObjetDependantDautres - Si 1 renvoie les objet qui dépendent d'autres tels que les CHECK / DEFAULT / ...

Source

  • ALTER PROCEDURE sql_RechercheChamp
  • @recherche nvarchar(128) = '',
  • @TableUniquement bit = 0,
  • @ObjetSysteme bit = 1,
  • @ObjetDependantDautres bit = 0
  • AS
  • BEGIN
  • DECLARE @BaseDonneesNom nvarchar(128)
  • DECLARE @BaseDonneesId int
  • DECLARE @sql nvarchar(max)
  • SET NOCOUNT ON
  • -- Création de la table temporaire qui contiendra les résultats
  • IF OBJECT_ID('tempdb..#resultat') IS NOT NULL
  • DROP TABLE #resultat
  • CREATE TABLE #resultat
  • (
  • BaseDonneesNom nvarchar(128),
  • BaseDonneesId int,
  • SchemaNom nvarchar(128),
  • SchemaId int,
  • ObjetType nvarchar(60),
  • ObjetNom nvarchar(128),
  • ObjetId int,
  • ChampNom nvarchar(128),
  • ChampType nvarchar(128),
  • ChampId int
  • )
  • -- Curseur bouclant sur les Bases de données
  • DECLARE BaseDonnees_curseur CURSOR
  • FOR SELECT name,
  • database_id
  • FROM sys.databases ;
  • OPEN BaseDonnees_curseur ;
  • FETCH NEXT FROM BaseDonnees_curseur INTO @BaseDonneesNom,
  • @BaseDonneesId ;
  • WHILE @@FETCH_STATUS = 0
  • BEGIN
  • -- Création de la requête à executer
  • SET @sql = 'SELECT ''' + @BaseDonneesNom
  • + ''' AS BaseDonneesNom, '
  • + CAST(@BaseDonneesId as nvarchar(11))
  • + ' AS BaseDonneesId, SCHEMA_NAME(obj.schema_id), obj.schema_id, obj.type_desc, obj.name, obj.object_id, col.name, typ.name, col.column_id FROM '
  • + QUOTENAME(@BaseDonneesNom)
  • + '.sys.columns AS col JOIN sys.objects AS obj ON col.object_id = obj.object_id JOIN sys.types AS typ ON col.system_type_id = typ.system_type_id WHERE col.name like ''%'
  • + @recherche + '%'''
  • + CASE @ObjetSysteme
  • WHEN 0 THEN ' AND obj.is_ms_shipped = 0 '
  • ELSE ''
  • END + CASE @TableUniquement
  • WHEN 1 THEN ' AND obj.type IN (''S'', ''U'') '
  • ELSE ''
  • END
  • + CASE @ObjetDependantDautres
  • WHEN 0 THEN ' AND obj.parent_object_id = 0 '
  • ELSE ''
  • END ;
  • INSERT INTO #resultat
  • EXEC ( @sql ) ;
  • FETCH NEXT FROM BaseDonnees_curseur INTO @BaseDonneesNom,
  • @BaseDonneesId ;
  • END ;
  • CLOSE BaseDonnees_curseur ;
  • DEALLOCATE BaseDonnees_curseur ;
  • SET NOCOUNT OFF
  • -- Renvoie le résultat de la recherche
  • SELECT BaseDonneesNom,
  • BaseDonneesId,
  • SchemaNom,
  • SchemaId,
  • ObjetType,
  • ObjetNom,
  • ObjetId,
  • ChampNom,
  • ChampType,
  • ChampId
  • FROM #resultat ;
  • END
  • GO
  • -- Recherche le texte 'recherche' dans les champs de tous les objets, systèmes ou non
  • EXEC sql_RechercheChamp 'recherche'
  • -- Recherche le texte 'recherche' dans les champs des tables uniquement, systèmes ou non
  • EXEC sql_RechercheChamp 'recherche', 1
  • -- Recherche le texte 'recherche' dans les champs des objets non systèmes
  • EXEC sql_RechercheChamp 'recherche', 0, 0
  • -- Recherche le texte 'recherche' dans les champs des objets dépendant d'autres (inclus entre autres les DEFAULT et CHECK)
  • EXEC sql_RechercheChamp @recherche = 'recherche', @ObjetDependantDautres = 1
ALTER PROCEDURE sql_RechercheChamp
    @recherche nvarchar(128) = '',
    @TableUniquement bit = 0,
    @ObjetSysteme bit = 1,
    @ObjetDependantDautres bit = 0
AS 
    BEGIN
        DECLARE @BaseDonneesNom nvarchar(128)
        DECLARE @BaseDonneesId int
        DECLARE @sql nvarchar(max)

        SET NOCOUNT ON

	-- Création de la table temporaire qui contiendra les résultats
        IF OBJECT_ID('tempdb..#resultat') IS NOT NULL 
            DROP TABLE #resultat
        CREATE TABLE #resultat
            (
              BaseDonneesNom nvarchar(128),
              BaseDonneesId int,
              SchemaNom nvarchar(128),
              SchemaId int,
              ObjetType nvarchar(60),
              ObjetNom nvarchar(128),
              ObjetId int,
              ChampNom nvarchar(128),
			  ChampType nvarchar(128),
              ChampId int
            )

        -- Curseur bouclant sur les Bases de données
		DECLARE BaseDonnees_curseur CURSOR
            FOR SELECT  name,
                        database_id
                FROM    sys.databases ;
        OPEN BaseDonnees_curseur ;
        FETCH NEXT FROM BaseDonnees_curseur INTO @BaseDonneesNom,
            @BaseDonneesId ;
        WHILE @@FETCH_STATUS = 0
            BEGIN
				
		-- Création de la requête à executer
                SET @sql = 'SELECT ''' + @BaseDonneesNom
                    + ''' AS BaseDonneesNom, '
                    + CAST(@BaseDonneesId as nvarchar(11))
                    + ' AS BaseDonneesId, SCHEMA_NAME(obj.schema_id), obj.schema_id, obj.type_desc, obj.name, obj.object_id, col.name, typ.name, col.column_id FROM '
                    + QUOTENAME(@BaseDonneesNom)
                    + '.sys.columns AS col JOIN sys.objects AS obj ON col.object_id = obj.object_id JOIN sys.types AS typ ON col.system_type_id = typ.system_type_id WHERE col.name like ''%'
                    + @recherche + '%'''
                    + CASE @ObjetSysteme
                        WHEN 0 THEN ' AND obj.is_ms_shipped = 0 '
                        ELSE ''
                      END + CASE @TableUniquement
                              WHEN 1 THEN ' AND obj.type IN (''S'', ''U'') '
                              ELSE ''
                            END
                    + CASE @ObjetDependantDautres
                        WHEN 0 THEN ' AND obj.parent_object_id = 0 '
                        ELSE ''
                      END ;

                INSERT  INTO #resultat
                        EXEC ( @sql ) ;

                FETCH NEXT FROM BaseDonnees_curseur INTO @BaseDonneesNom,
                    @BaseDonneesId ;
            END ;
        CLOSE BaseDonnees_curseur ;
        DEALLOCATE BaseDonnees_curseur ;

        SET NOCOUNT OFF

	-- Renvoie le résultat de la recherche
        SELECT  BaseDonneesNom,
                BaseDonneesId,
                SchemaNom,
                SchemaId,
                ObjetType,
                ObjetNom,
                ObjetId,
                ChampNom,
				ChampType,
                ChampId
        FROM    #resultat ;
    END
GO

-- Recherche le texte 'recherche' dans les champs de tous les objets, systèmes ou non
EXEC sql_RechercheChamp 'recherche'

-- Recherche le texte 'recherche' dans les champs des tables uniquement, systèmes ou non
EXEC sql_RechercheChamp 'recherche', 1

-- Recherche le texte 'recherche' dans les champs des objets non systèmes
EXEC sql_RechercheChamp 'recherche', 0, 0

-- Recherche le texte 'recherche' dans les champs des objets dépendant d'autres (inclus entre autres les DEFAULT et CHECK)
EXEC sql_RechercheChamp @recherche = 'recherche', @ObjetDependantDautres = 1

 Conclusion

Je vais essayer de faire un Proc stock équivalente sur SQL Server 7 / 2000... Et eventuellement ajouter des critères de recherche.


 Historique

10 avril 2007 09:36:38 :
Ajout de la description
10 avril 2007 09:44:02 :
correction de la description
12 avril 2007 21:35:32 :
Ajout du QUOTENAME sur le nom de la base de données et du type dans le résultat

 Sources du même auteur

SQL SERVER : VÉRIFICATION DE L'ESPACE LIBRE SUR LE SERVEUR
SQL SERVER : CONVERSION IP EN CHAÎNE DE TEXTE VERS INTEGER E...
SQL SERVER 2005 : HISTORISER LES PROCÉDURES STOCKÉES D'UNE B...
SQL SERVER 2005 : RÉCUPÉRER LE CONTENU D'UN SCHÉMA XSD
SQL SERVER – AGRÉGER DES CHAMPS VARCHAR

 Sources de la même categorie

Source avec Zip (SQL SERVER) REQUÊTE POUR RECHERCHER UN {GUID} DANS TOUS LES... par lassaad83
[ORACLE]DÉTERMINER LA DATE DU PREMIER JOUR D'UNE SEMAINE PAR... par Bouillou2
T-SQL - PROCÉDURE - STOCKÉE - PLACER DANS UNE TABLE LE RÉSUL... par zavier666
SQL LECTURE IMPORT DE FICHIER TEXTE par PHILIPPO
Source avec Zip GÉNÉRER DES REQUETES INSERT À PARTIR DES DONNÉES EXISTANTES ... par lassaad83

 Sources en rapport avec celle ci

SQL SERVER 2000 - VIDER ET COMPACTER TOUTES LES BASES DE DON... par fabrice69
SQL SERVER 2005 : HISTORISER LES PROCÉDURES STOCKÉES D'UNE B... par skweeky
VALIDATION DU FORMAT DU N° DE TÉLÉPHONE AVEC TSQL par bad_smi
SQL SERVER - RECHERCHE DANS FICHIER GRACE À INDEXING SERVER par white_mage
SQL SERVER - RÉCUPÈRER LES NOM DES CHAMPS D'UNE TABLE AVECLE... par white_mage

Commentaires et avis

Commentaire de bad_smi le 11/04/2007 12:42:06

très bon script, moyen de ne plus se perdre;)
il sert à quoi le NOCOUNT ?

Commentaire de skweeky le 11/04/2007 18:50:14 administrateur CS

Il permet de ne pas renvoyé le xx enregitrements affectées pour les INSERT / SELECT entre le SET NOCOUNT ON et SET NOCOUNT OFF... Ca fait un peut plus propre

Commentaire de bad_smi le 11/04/2007 18:59:34

cela veut dire qu'on peut l'utiliser à chaque fois qu'on exécute des ordres INSERT/SELECT ?

Commentaire de skweeky le 14/04/2007 18:05:30 administrateur CS

On l'utilse pas systématiquement c'est pour masquer le fonctionnement interne de la procédure, on fait souvent de même dans un TRIGGER.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Procédure Stockée Recherche dans une table [Urgent] [ par Mr Capone ] Bonjour, je souhaite a l'aide d'une procédure stocké savoir si une valeur existe dans une table mais j'y arrive pas. voici mon code : cre Sauvegarde automatique sqlserver 2000 [ par jojos89 ] Salut a tous,J'ai une base de données en local sur mon pc (avec sqlserver 2000)que je voudrais sauvegardé automatique (tous les soir) s Requête avec champ Null [ par Blaster13 ] Bonjour à tous,J'ai un petit souci et n'étant pas un champion du SQL ni du VBA je voulais savoir s'il existait une solution:Petit résum Saisie dans un champ de formulaire vers BDD sous Access [ par alala ]             Bonjour tt le monde!   Je débute en Access et je dois cr&# access : insert into champ boolean [ par trexor ] Bonjour,j'ai un champ access boolean (true/false) que je dois remplir avec vb.net, mais j'ai une erreur insert into  Voici ma requte :D aide pour SQLSERVER [ par nagrom_om ] salut,quelqu'un sait il comment peut on avoir un listing des requetes qui sont passées sous SQL Server ??Merci ! Recherche dans toute la base de données [ par RugbyOne ] Bonjour, Est-il possible de faire une recherche dans toute la base de données à l'aide d'une requête ? Je m'explique : j'ai une base SQL Server 2000 ms access - sqlserver - procédurestockée [ par metasky ] bonjour,je suis actuellement sur une appli liant access et sqlserver...quand je consulte mes procédures stockées dans mon projet access les Suppression de caracteres dans un champ TEXT [ par Sbt ] Bonjour à tous, Dans une de mes tables, il y a un champ TEXT, nommé RES_TXT. Dans ce champ, on y insert tout un fichier texte, sur lequel on n'a pas problème de recherche dans une base de donnée mysql [ par Xini28 ] Lorsque je fais une recherche dans une base de données mysql, il s'affiche "Resource id #3" au lieu de ce que je recherche. Quelqu'un sait de quo


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales