Как я могу найти, какие типы SQL с сервера SQL не вызывается в моей программе? - PullRequest
1 голос
/ 20 июня 2019

У меня есть приложение vb.net windows form, которое связано с SQL Server. Я хотел бы получить список с именем хранимых процедур / функций (и таблиц, если это возможно), которые не являются необходимыми для моего приложения (потому что, вероятно, старые, например, "sp_old_1").

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

1 Ответ

0 голосов
/ 20 июня 2019

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

select distinct
       o.name as procedure_name
from   sys.sql_modules m
  inner join sys.objects o ON m.object_id = o.object_id
where o.Type = 'P'  

Но нет способа, которым sql server может узнать, используете ли вы его или нет внутри вашего приложения VB.Таким образом, ваш единственный вариант - поиск по каждому имени процедуры в вашем исходном коде

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

select distinct
       o.name 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
where m.definition Like '%your procedure name%'

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

EDIT

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

, это будет выглядеть примерно так

declare @t table (procname varchar(200), called_in varchar(200))
declare @ProcName varchar(200)

declare crProcs cursor local FAST_FORWARD READ_ONLY for
  select distinct
         o.name as procedure_name
  from   sys.sql_modules m
    inner join sys.objects o ON m.object_id = o.object_id
  where o.Type = 'P'

open crProcs
fetch next from crProcs into @ProcName
while @@FETCH_STATUS = 0
begin
     insert into @t (procname, called_in)
     select @ProcName,
            o.name
     from   sys.sql_modules m
       inner join sys.objects o ON m.object_id = o.object_id
     where  m.definition Like '%' + @ProcName + '%'
     group by o.name

     fetch next from crProcs into @ProcName
end 
close crProcs
deallocate crProcs

select * 
from   @t t
where  1 < (select count(1) from @t t2 where t2.procname = t.procname )
...