2009-12-29 24 views
17

Tôi muốn tạo ra một truy vấn vào danh sách của tất cả người sử dụng thủ tục lưu trữ được xác định, trừ những người có hệ thống các thủ tục lưu trữ, xem xét rằng:Làm cách nào để liệt kê tất cả các quy trình không được lưu trữ trên hệ thống?

  1. Kiểm tra tên như "sp_" không hoạt động vì có người dùng thủ tục được lưu trữ bắt đầu bằng "sp_".
  2. Kiểm tra thuộc tính is_ms_shipped không hoạt động vì có các thủ tục được lưu trữ hệ thống có cờ = 0, ví dụ: sp_alterdiagram (nó không được MSShipped nhưng xuất hiện trong Hệ thống lưu trữ thủ tục trong SQL Server Management Studio).

Phải có thuộc tính hoặc cờ ở đâu đó vì bạn có thể thấy "Quy trình lưu trữ hệ thống" trong một thư mục riêng trong SQL 2005. Có ai biết không?


Edit: Một sự kết hợp của các gợi ý dưới đây làm việc cho tôi:

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 

Trả lời

12

Bạn nên sử dụng một cái gì đó như thế này:

select * from sys.procedures where is_ms_shipped = 0 

Như bạn có thể đoán, chính là trong is_ms_shipped thuộc tính (nó cũng tồn tại trong chế độ xem sys.objects).

CẬP NHẬT. Ban đầu đã bỏ lỡ quan điểm của bạn về is_ms_shipped.

Đây là mã (điều kiện) mà Management Studio thực sự sử dụng để lấy một danh sách các 'hệ thống lưu trữ thủ tục'

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 

Đây sp đề cập đến quan điểm hệ thống sys.all_objects.

+0

ông đề cập đến is_ms_shipped trong câu hỏi của mình và nói rằng nó không đáng tin cậy. –

+0

Đã bỏ lỡ điều này lúc đầu, nhưng đã cập nhật đề xuất của tôi một chút sau đó. – AlexS

1

thử này

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

thủ tục Nếu vì một số lý do bạn đã không thuộc hệ thống lưu trữ trong cơ sở dữ liệu tổng thể, bạn có thể sử dụng các truy vấn (điều này sẽ lọc ra các hệ thống lưu trữ thủ tục MOST:

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

bạn thấy thêm thông tin trong câu trả lời sau

Query that returns list of all Stored Procedures

2

Có ba loại 'hệ thống' thủ tục:

  • thủ tục SQL Đúng, những người trong schema 'sys', sẽ được tìm thấy như thủ tục thông thường trong mssqlsystemresource cơ sở dữ liệu.
  • Thủ tục người dùng thông thường được cài đặt bởi các thành phần khác nhau. Đây là những thích của thủ tục sao chép, thu thập dữ liệu, theo dõi thay đổi, khung quản lý khai báo và khác. Họ không phải là hệ thống ở tất cả, họ sống trong lược đồ 'dbo' và chỉ đơn giản là thị trường là 'hệ thống'. Một số có thể được xác định bằng cờ 'IsMSShipped', nhưng không phải tất cả.
  • quy trình giả launguage. Đây là những câu lệnh T-SQL được coi là thủ tục và bạn sẽ không tìm thấy chúng ở bất kỳ đâu.
4

sử dụng câu trả lời đầu tiên ở trên, tôi đã viết những điều sau đây mà hoạt động tốt cho các mục đích của tôi:

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

tôi sẽ chỉ quăng trong tôi "cải thiện" phiên bản của SQL (nhận dạng đó là một vấn đề sở thích cá nhân):

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

đây là những gì tôi đã làm trên cơ sở các giải pháp trên:

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

Truy vấn đơn này hoạt động trên SQL Server 2008 nhưng chưa được thử nghiệm với các phiên bản khác.

Các vấn đề liên quan