Как сравнить одну хранимую процедуру с сотнями баз данных?T-SQL - PullRequest
0 голосов
/ 13 мая 2018

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

Я попробовал следующее решение кода:

select 
    'select OBJECT_NAME(object_id), OBJECT_DEFINITION(object_id) from ' + 
    name + '.sys.procedures where name like ''sp_someProcedure%'' union'  
from 
    master.sys.databases

Затем я попытался сгенерировать сценарии, которые были выведены в суб-выбор, где я делаю группу с помощью хранимой процедуры.Это не работает, потому что по какой-то причине вы не можете объединить несколько баз данных для sys (если я не ошибаюсь).Каждый оператор выбора остается в контексте того, что вы используете.Поэтому используйте databaseOne, оставаясь в databaseOne, хотя следующий оператор выбора - это выбрать бла-бла-бла из databaseTwo.

Есть мысли?

1 Ответ

0 голосов
/ 13 мая 2018

Во-первых, давайте начнем не по теме с полезной статьи: Префикс sp_ по-прежнему запрещен? . Не начинайте имя вашего SP с sp_, оно зарезервировано Microsoft для системных хранимых процедур. Далее в статье обсуждается, почему это плохая идея; Проще говоря, ваш SP может (внезапно) перестать работать в один прекрасный день, а также может нанести удар по производительности.

Теперь подробнее по теме. Вместо этого вы могли бы использовать недокументированное sp sp_msforeachdb. Это приводит к чему-то вроде:

CREATE TABLE #Procs (ObjectName sysname, ObjectDefination nvarchar(MAX));

DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT OBJECT_NAME(object_id), OBJECT_DEFINITION(object_id)' + NCHAR(10) +
           N'FROM [?].sys.procedures' + NCHAR(10) + 
           N'WHERE [name] LIKE ''sp_someProcedure%'';';

INSERT INTO #Procs
EXEC sp_msforeachdb @SQL;

SELECT *
FROM #Procs;

DROP TABLE #Procs;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...