Найти все ссылки для просмотра - PullRequest
6 голосов
/ 01 октября 2009

У меня есть различные базы данных, и что быть уверенным, что я удаляю что-то (вид в данном случае), которое действительно осиротело. Правильный SQL для использования:

SELECT r.routine_name, 
       r.routine_definition
  FROM INFORMATION_SCHEMA.ROUTINES r
 WHERE r.routine_definition LIKE '%my_view_name%' 

Проблема в том, что эти ссылки не собирают объявления в хранимых процедурах, и я не знаю, что еще.

Я нашел ТАК вопрос , который я запомнил, но он тоже не помогает. Это:

SELECT t.*
  FROM SYSCOMMENTS t
 WHERE CHARINDEX('my_view_name', t.text) > 0

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

Ответы [ 3 ]

22 голосов
/ 02 октября 2009

У вас есть только один вариант.

select
    object_name(m.object_id), m.*
from
    sys.sql_modules m
where
    m.definition like N'%my_view_name%'

syscomments и INFORMATION_SCHEMA.routines имеют столбцы nvarchar (4000). Так что, если «myViewName» используется в позиции 3998, он не будет найден. syscomments имеет несколько строк, но ROUTINES усекает.

1 голос
/ 02 октября 2009

Я не уверен, но я думаю, что вы можете использовать что-то вроде этого, если ваше представление используется в какой-то хранимой процедуре

SELECT *  
FROM syscomments c  
INNER JOIN sysobjects o ON c.id =o.id 
WHERE text LIKE '%my_view_name%' AND xtype ='p'
1 голос
/ 02 октября 2009

Ваш метод не полностью корректен. Прочитайте эту статью:

http://www.mssqltips.com/tip.asp?tip=1294

Ваш метод не вернет никакого результата, если другое представление использует это представление.

SQL Server 2008 имеет специальное представление (sys.dm_sql_referencing_entities), здесь это не так просто.

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