Узнайте, в какой базе данных находится хранимая процедура - PullRequest
3 голосов
/ 12 октября 2011

У меня есть список идентификаторов и имен хранимых процедур, и мне нужно выяснить, в какой базе данных на сервере они находятся.Есть простой способ сделать это?Как системная таблица, в которой хранится эта информация?

Спасибо

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Как правило, для этого типа запроса вам потребуется циклически просматривать список баз данных (возможно, используя sp_MSforeachdb) и запрашивать отдельные системные таблицы в каждой базе данных.

Нижеследующее может работать для вас, хотя это избегает. Первый метод проверяет object_id и name, но не проверяет, действительно ли объекты являются хранимыми процедурами.

Второй просто использует имя, запрошенное в комментариях, также проверяет тип объекта, но проверяет только схему по умолчанию.

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 голосов
/ 12 октября 2011

Дайте этому водоворот.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...