找出存储过程所在的数据库

时间:2011-10-12 13:55:37

标签: database sql-server-2008 stored-procedures

我有一个存储过程ID和名称列表,我需要找出它们所在的服务器中的哪个数据库。是否有捷径可寻?就像存储这些信息的系统表一样?

由于

2 个答案:

答案 0 :(得分:1)

通常,对于这种类型的查询,您需要遍历数据库列表(可能使用sp_MSforeachdb)并查询每个数据库中的各个系统表。

以下内容可能对您有用,但可以避免这种情况。第一种方法检查object_idname但不做任何验证对象实际存储过程。

第二个只使用注释中请求的名称,也验证对象类型,但只检查默认模式。

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 

答案 1 :(得分:0)

给它一个旋转。

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