Сценарий SQL для изменения всех ссылок на таблицы во всех хранимых процедурах

#sql #tsql #procedure

#sql #sql-сервер #sql-server-2005

Вопрос:

Я создал новую базу данных с копиями существующих таблиц, но изменил имена этих таблиц, есть ли SQL-скрипт, который я могу запустить (возможно, с помощью SysObjects), чтобы изменить все ссылки на эти таблицы во всех хранимых процедурах?

Комментарии:

1. Я предполагаю, что SQL Server упоминается sysobjects ? Если да, то какая версия?

2. Создайте сценарии для ваших хранимых процедур , а затем выполните поиск и замену для всех имен таблиц , которые вы изменили …

3. не запускайте команды ОБНОВЛЕНИЯ для системных таблиц!!!! выполните необходимые процедуры, внесите изменения (поиск / замена или вручную), а затем запустите сценарии!!!

4. НЕ ПОЛАГАЙТЕСЬ НА INFORMATION_SCHEMA.ROUTINES , потому ROUTINE_DEFINITION что только nvarchar(4000) . Вам нужно использовать sys.sql_modules where definition is nvarchar(max) . Посмотрите на мой ответ для примера запросов.

Ответ №1:

НЕ ПОЛАГАЙТЕСЬ НА INFORMATION_SCHEMA.ROUTINES, потому ROUTINE_DEFINITION что только nvarchar(4000) . Вам нужно sys.sql_modules указать, где definition находится nvarchar(max)

попробуйте любой из этих способов, чтобы найти процедуру, которую необходимо изменить:

 SELECT DISTINCT
    LEFT(s.name '.' o.name, 100) AS Object_Name,o.type_desc --, m.definition
    FROM sys.sql_modules        m
        INNER JOIN sys.objects  o ON m.object_id=o.object_id
        INNER JOIN sys.schemas  s ON o.schema_id=s.schema_id
    WHERE m.definition Like '%' @SearchValue '%'
    ORDER BY 1

SELECT
    OBJECT_SCHEMA_NAME(m.object_id) '.' OBJECT_NAME(m.object_id) --, m.definition
    FROM sys.sql_modules  m
    WHERE m.definition like '%whatever%'

SELECT
    OBJECT_SCHEMA_NAME(m.object_id) '.' OBJECT_NAME(m.object_id), o.type_desc
        --,m.definition
    FROM sys.sql_modules        m
        INNER JOIN sys.objects  o ON m.object_id=o.object_id
    WHERE m.definition like '%whatever%'
 

вы можете раскомментировать m.definition список содержимого, но я считаю, что лучше просто идентифицировать все процедуры, а затем просмотреть их вручную, потому что вы не хотите запускать команды обновления для системных таблиц. Выполните необходимые процедуры, внесите изменения (поиск / замена или вручную), а затем запустите сценарии!!!

Ответ №2:

Нет.

Я считаю, что рефакторинг SQL от Redgate обладает этой функциональностью. В противном случае вы могли бы создать сценарий для всех объектов и вручную или с помощью кода выполнить поиск и замену.

SQL Server 2005 также поддерживает синонимы, которые могут оказать некоторую помощь.

Комментарии:

1. Да, в SQL Refactor есть функция интеллектуального переименования, которая изменяет все ссылки переименованного объекта, как и SQL Prompt 5, который должен выйти очень скоро.

Ответ №3:

Вот фрагмент SQL, который можно использовать для получения определения хранимых процедур, соответствующих определенным критериям поиска. Вы могли бы просто изменить его, чтобы выполнить поиск и замену, как предложил Мартин.

Просто измените ‘% ИМЯ_ТАБЛИЦЫ%’ на ваши критерии поиска или имя таблицы, которое вы хотели бы изменить.

 SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%TABLE_NAME%' AND ROUTINE_TYPE='PROCEDURE'
 

Комментарии:

1. НЕ ПОЛАГАЙТЕСЬ НА INFORMATION_SCHEMA.ROUTINES , потому ROUTINE_DEFINITION что только nvarchar(4000) . Вам нужно использовать sys.sql_modules where definition is nvarchar(max) . Посмотрите на мой ответ для примера запросов.

Ответ №4:

Если это краткосрочно (например, тестовая база данных), более простым решением может быть создание a VIEW для каждой таблицы, которую вы изменили, используя старое имя. Например, если вы изменили таблицу tests на tests_new вы можете сделать:

 CREATE VIEW dbo.tests
AS
SELECT * FROM dbo.tests_new
 

Все ваши процедуры будут использовать эту ссылку dbo.tests для фактического просмотра данных dbo.tests_new .

Это очень, очень плохая идея, если это будет постоянная / производственная база данных, поскольку она просто добавляет слой запутывания в вашу структуру и сделает ее кошмаром для обслуживания.

Ответ №5:

Вы не можете изменить ссылки на таблицы в sprocs через системный словарь данных — вам нужно будет получить сценарий, который создает хранимую процедуру, и изменить имена таблиц в сценарии. Если у вас есть сценарии, по большей части это простой поиск и замена.

Если у вас нет скриптов, вы можете получить текст скриптов хранимых процедур из sys.sql_modules или получить его через SSMS.