SQL-скрипт для изменения всех ссылок на таблицы во всех хранимых процедурах - PullRequest
3 голосов
/ 06 декабря 2010

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

Спасибо.

Ответы [ 5 ]

4 голосов
/ 06 декабря 2010

НЕ ПОЛЬЗОВАТЬСЯ ИНФОРМАЦИЕЙ_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перечислить содержимое, но я считаю, что лучше просто идентифицировать все процедуры, а затем просмотреть их вручную, потому что вы не хотите запускать команды UPDATE для системных таблиц.Запишите необходимые процедуры, внесите изменения (поиск / замена или вручную), а затем запустите сценарии !!!

3 голосов
/ 06 декабря 2010

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

Просто замените "% TABLE_NAME%" на свои критерии поиска или имя таблицы, которую вы хотите изменить.

Надеюсь, это поможет.

SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%TABLE_NAME%' AND ROUTINE_TYPE='PROCEDURE'
3 голосов
/ 06 декабря 2010

номер

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

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

1 голос
/ 06 декабря 2010

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

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

1 голос
/ 06 декабря 2010

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

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

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

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

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