2011-10-12 12 views

Répondre

1

En général, pour ce type de requête vous auriez besoin de boucler la liste des bases de données (en utilisant peut-être sp_MSforeachdb) et interroger les tables système individuelles dans chaque base de données.

Ce qui suit pourrait bien fonctionner pour vous, ce qui évite cela. La première méthode vérifie object_id et name mais ne vérifie pas que les objets sont réellement des procédures stockées.

La seconde utilise simplement le nom comme demandé dans les commentaires, valide également le type d'objet, mais vérifie seulement le schéma par défaut.

WITH objects(name, id) 
    AS (SELECT 'uspGetBillOfMaterials', 23671132 UNION ALL 
     SELECT 'uspPrintError', 37575172) SELECT 'Using Id and Name', 
     sys.databases.name, 
     objects.name 
FROM sys.databases, 
     objects 
WHERE OBJECT_NAME(id, database_id) = objects.name 
UNION ALL 
SELECT 'Using Name (assumes default schema)', 
     sys.databases.name, 
     objects.name 
FROM sys.databases, 
     objects 
WHERE OBJECT_ID(databases.name + '..uspGetBillOfMaterials', 'P') IS NOT NULL 
+0

Très cool, fait exactement ce dont j'avais besoin. Merci! Comment le code changerait-il si c'était juste le nom que j'avais? Juste penser comme je dois le faire avec d'autres objets dans le futur et je ne pourrais pas avoir l'ID. Cela signifie que la validation n'est pas un problème cependant. Merci encore. – jimminybob

+0

@jimminybob - Si vous n'aviez que le nom, cela ne fonctionnerait pas car il tire parti du fait que 'OBJECT_NAME' accepte un second paramètre pour l'ID de base de données. Ce n'est pas le cas pour la fonction inverse "OBJECT_ID". Vous devez interroger les vues de catalogue de base de données individuellement dans ce cas. –

+0

Ah je vois. Pas de soucis alors. Merci pour toute votre aide – jimminybob

0

Donnez-lui un tourbillon.

DROP TABLE #Databases 

CREATE TABLE #Databases (ID INTEGER IDENTITY (0,1), DbName NVARCHAR(128)) 

INSERT INTO #Databases(DbName) 
SELECT name FROM sys.databases 

DECLARE @CurrentID INTEGER = 0, 
     @MaxID  INTEGER = (SELECT MAX(ID) FROM #Databases) 

DECLARE @DbName NVARCHAR(128) = (SELECT DbName FROM #Databases WHERE ID = @CurrentID), 
     @SqlCommand VARCHAR(MAX) 



WHILE (@CurrentID <= @MaxID) 
BEGIN 
    SET @SqlCommand = 'SELECT name,ROUTINES.SPECIFIC_SCHEMA,ROUTINES.SPECIFIC_NAME 
         FROM sys.databases AS DatabaseNames 
         INNER JOIN ' + @DbName + '.INFORMATION_SCHEMA.ROUTINES AS ROUTINES 
           ON ROUTINES.SPECIFIC_CATALOG = DatabaseNames.name 
         WHERE ROUTINES.ROUTINE_TYPE = ''PROCEDURE'' 
         AND ROUTINES.SPECIFIC_NAME IN (''X'',''Y'')' 

    EXEC (@SqlCommand) 

    SET @CurrentID = @CurrentID + 1 
    SELECT @DbName = DbName 
    FROM #Databases 
    WHERE ID = @CurrentID 

END 
Questions connexes