2009-12-29 9 views
17

Chcę utworzyć kwerendę do listy wszystkich procedur określonych przez użytkownika przechowywane, z wyjątkiem tych, które są przechowywane procedury systemowe, biorąc pod uwagę, że:Jak wyświetlić wszystkie niesystemowe procedury przechowywane?

  1. Sprawdzanie nazwy takie jak „sp_” nie działa, ponieważ istnieje użytkownik procedury przechowywane zaczynające się od "sp_".
  2. Sprawdzanie właściwości is_ms_shipped nie działa, ponieważ istnieją procedury przechowywane w systemie, które mają flagę = 0, na przykład: sp_alterdiagram (nie jest to MSShipped, ale pojawia się w System Stored Procedures w SQL Server Management Studio).

Musi istnieć właściwość lub flaga gdzieś, ponieważ można zobaczyć "Procedury składowane w systemie" w oddzielnym folderze w SQL 2005. Czy ktoś wie?


Edit: Połączenie z sugestiami poniżej pracował dla mnie:

select * 
from 
    sys.objects    O LEFT OUTER JOIN 
    sys.extended_properties E ON O.object_id = E.major_id 
WHERE 
    O.name IS NOT NULL 
    AND ISNULL(O.is_ms_shipped, 0) = 0 
    AND ISNULL(E.name, '') <> 'microsoft_database_tools_support' 
    AND O.type_desc = 'SQL_STORED_PROCEDURE' 
ORDER BY O.name 

Odpowiedz

12

Należy używać coś takiego:

select * from sys.procedures where is_ms_shipped = 0 

Jak można się domyślać, klucz jest w Atrybut is_ms_shipped (istnieje również w widoku sys.objects).

AKTUALIZACJA. Początkowo pominąłeś twój punkt dotyczący is_ms_shipped.

Jest to kod (warunek), który faktycznie korzysta Management Studio, aby pobrać listę 'system przechowywane procedury'

CAST(
case 
when sp.is_ms_shipped = 1 then 1 
when (
    select 
     major_id 
    from 
     sys.extended_properties 
    where 
     major_id = sp.object_id and 
     minor_id = 0 and 
     class = 1 and 
     name = N''microsoft_database_tools_support'') 
    is not null then 1 
else 0 
end AS BIT) = 1 

Tu sp odnosi się do widoku układu sys.all_objects.

+0

wspomina o is_ms_shipped w swoim pytaniu i mówi, że nie jest niezawodny. –

+0

Tęskniłem za tym początkowo, ale zaktualizowałem moją sugestię nieco później. – AlexS

1

spróbować to

select * from DatabaseName.information_schema.routines where routine_type = 'PROCEDURE' 

procedury Jeśli z jakiegoś powodu trzeba było zapisane non-System w głównej bazy danych, można użyć kwerendy (będzie to odfiltrować większość systemów przechowywane procedury:

select * from master.information_schema.routines where routine_type = 'PROCEDURE' and 
Left(Routine_Name, 3) NOT IN ('sp_', 'xp_', 'ms_') 

zobaczyć więcej informacji w następującej odpowiedzi

Query that returns list of all Stored Procedures

2

Istnieją trzy rodzaje procedur „system”:

  • Prawdziwe procedur SQL, te w schemacie do „SYS”, będzie można znaleźć w zwykłych procedur mssqlsystemresource bazie.
  • Zwykłe procedury użytkownika instalowane przez różne komponenty. Są to procedury replikacji, gromadzenia danych, śledzenia zmian, deklaratywnego frameworka managmenet i inne. Nie są wcale systemem, żyją w schemacie "dbo" i są po prostu sprzedawane jako "system". Niektóre mogą być identyfikowane przez flagę "IsMSShipped", ale nie wszystkie.
  • pseudo-procedury. Są to instrukcje T-SQL opisywane jako procedury, których nie znajdziesz nigdzie.
4

stosując powyższy pierwsza odpowiedź, napisałem następujące która działa dobrze dla moich zastosowań:

select 
     * 
    from 
     INFORMATION_SCHEMA.ROUTINES as ISR 
    where 
     ISR.ROUTINE_TYPE = 'PROCEDURE' and 
     ObjectProperty (Object_Id (ISR.ROUTINE_NAME), 'IsMSShipped') = 0 and 
     (
      select 
       major_id 
      from 
       sys.extended_properties 
      where 
       major_id = object_id(ISR.ROUTINE_NAME) and 
       minor_id = 0 and 
       class = 1 and 
       name = N'microsoft_database_tools_support' 
     ) is null 
    order by 
     ISR.ROUTINE_CATALOG, 
     ISR.ROUTINE_SCHEMA, 
     ISR.ROUTINE_NAME 
3

Ja po prostu rzucić w moim „lepszą” wersją SQL (zdając sobie sprawę, że formatowanie jest sprawą od osobistych preferencji):

SELECT * 
FROM [sys].[procedures] sp 
WHERE is_ms_shipped = 0 
AND NOT EXISTS (
    select ep.[major_id] 
    from [sys].[extended_properties] ep 
    where ep.[major_id] = sp.[object_id] 
    and ep.[minor_id] = 0 
    and ep.[class] = 1 
    and ep.[name] = N'microsoft_database_tools_support') 
0

Oto co zrobiłem bazę na powyższych rozwiązań:

select * from sys.procedures 
where object_id not in(select major_id from sys.extended_properties) 

To pojedyncze zapytanie działa na serwerze SQL Server 2008, ale nie przetestowano go w innych wersjach.

Powiązane problemy