2008-09-23 60 views
7

Tôi có một cơ sở dữ liệu khổng lồ với 100 bảng và các thủ tục được lưu trữ. Sử dụng SQL Server 2005, làm cách nào tôi có thể nhận danh sách các thủ tục được lưu trữ đang thực hiện thao tác chèn hoặc cập nhật trên một bảng nhất định.Danh sách các thủ tục được lưu trữ từ Bảng

Trả lời

10
select 
    so.name, 
    sc.text 
from 
    sysobjects so inner join syscomments sc on so.id = sc.id 
where 
    sc.text like '%INSERT INTO xyz%' 
    or sc.text like '%UPDATE xyz%' 

này sẽ cung cấp cho bạn một danh sách của tất cả các nội dung thủ tục lưu trữ với INSERT hoặc UPDATE trong họ cho một bảng cụ thể (bạn rõ ràng có thể tinh chỉnh các truy vấn cho phù hợp). Các thủ tục dài hơn sẽ bị phá vỡ trên nhiều hàng trong bản ghi đã trả về, do đó bạn có thể cần thực hiện một chút việc chọn lọc thủ công thông qua kết quả.

Chỉnh sửa: Truy vấn đã được tinh chỉnh để trả lại tên SP. Ngoài ra, lưu ý truy vấn trên sẽ trả về mọi UDF cũng như SP.

+0

điều này cho tôi id SP ... tôi có thể tiếp cận tên SP với id này không? – Vinodtiru

+0

Vâng, tôi đã tinh chỉnh truy vấn để bao gồm điều đó. Tôi thấy bây giờ có một vài câu trả lời khác đã được đăng mà sẽ giúp bạn có được nó là tốt. –

+0

Câu trả lời của tôi ở đây: http://stackoverflow.com/questions/119679/list-of-stored-procedure-from-table#119719 gần như giống hệt nhau (trả về tên). Tuy nhiên, tôi nghĩ rằng Luke là đúng trong đó không cần phải sử dụng DISTINCT như trong câu trả lời của tôi –

1

Bạn có thể thử xuất tất cả các thủ tục đã lưu trữ của mình thành tệp văn bản và sau đó sử dụng tìm kiếm đơn giản.

Kỹ thuật nâng cao hơn sẽ là sử dụng tìm kiếm regexp để tìm tất cả các mục SELECT FROM và INSERT FROM.

0
SELECT Distinct SO.Name 
FROM sysobjects SO (NOLOCK) 
INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID 
AND SO.Type = 'P' 
AND (SC.Text LIKE '%UPDATE%' OR SC.Text LIKE '%INSERT%') 
ORDER BY SO.Name 

This link được sử dụng làm tài nguyên cho tìm kiếm SP.

2

Sử dụng sys.dm_sql_referencing_entities

Lưu ý rằng sp_depends bị lỗi thời.

MSDN Reference

1

Điều này dường như làm việc:

select
so.name as [proc],
so2.name as [table],
sd.is_updated
from sysobjects so
inner join sys.sql_dependencies sd on so.id = sd.object_id
inner join sysobjects so2 on sd.referenced_major_id = so2.id
where so.xtype = 'p' -- procedure
and is_updated = 1 -- proc updates table, or at least, I think that's what this means

14

sys.sql_dependencies có một danh sách các thực thể với phụ thuộc, bao gồm các bảng và cột một sproc bao gồm trong các truy vấn. Xem this post để biết ví dụ về truy vấn loại bỏ các phụ thuộc. Đoạn mã bên dưới sẽ nhận danh sách phụ thuộc bảng/cột theo thủ tục được lưu trữ

select sp.name  as sproc_name 
     ,t.name  as table_name 
     ,c.name  as column_name 
from sys.sql_dependencies d 
join sys.objects t 
    on t.object_id = d.referenced_major_id 
join sys.objects sp 
    on sp.object_id = d.object_id 
join sys.columns c 
    on c.object_id = t.object_id 
    and c.column_id = d.referenced_minor_id 
where sp.type = 'P' 
+0

[Thư viện MSDN] (http://msdn.microsoft.com/en-us/library/ms174402.aspx) nói rằng điều này hiện không được chấp nhận và nên được thay thế bằng sys.sql_expression_dependencies. Thật không may tôi không thể có được tương đương với công việc. Trong truy vấn được hiển thị trong câu trả lời d.object_id không còn tồn tại. Tôi đã thử d.referencing_id nhưng điều đó không hoạt động. Bất kỳ ý tưởng làm thế nào để sử dụng sql_expression_dependencies? – Drew

+1

Trên 'sys.sql_expression_dependencies',' referencing_id' là mục tham chiếu đích, và 'referenced_id' là phụ thuộc. Bảng này cũng có các tên lược đồ và thực thể cho các thực thể được tham chiếu trong bảng. ID nhỏ tham chiếu đến số cột, với 0 cho biết không có tham chiếu cột cụ thể. – ConcernedOfTunbridgeWells

+0

Tôi nghĩ rằng tôi có tất cả những điều đó. Tôi nghĩ rằng vấn đề là tất cả các hàng sql_expression_dependencies của tôi có một 0 cho referenced_minor_id. Truy vấn tương tự của sql_dependencies trả về nhiều hàng khác 0 và tôi ngạc nhiên về kết quả khác nhau như chúng. Nó dường như có hiệu quả làm cho sql_expression_dependencies rất ít hữu ích vì tôi thường muốn xem sprocs nào đang tham chiếu đến một cột cụ thể. Để tham khảo, tôi đã chọn số đếm (*) từ cả hai nơi referenced_minor_id <> 0. Có 38119 hàng như vậy trong sql_dependencies và 112 trong sql_expression_dependencies. – Drew

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