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
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.
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.
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.
Đ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
Nếu bạn tải về từ trang web của sp_search_code Vyaskn của nó sẽ cho phép bạn tìm thấy bất kỳ văn bản trong đối tượng cơ sở dữ liệu của bạn.
http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm
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'
[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
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
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
- 1. Mẫu lưu trữ với các thủ tục được lưu trữ
- 2. Lấy danh sách tham số từ một SQLDataSource được lưu trữ Thủ tục tên
- 3. Gọi thủ tục lưu trữ từ một thủ tục lưu trữ SQL Server
- 4. Lấy danh sách các thủ tục được lưu trữ đã lọc bằng t-sql
- 5. Gọi thủ tục lưu trữ trong một thủ tục được lưu trữ trong MySQL
- 6. Chức năng so với các thủ tục được lưu trữ
- 7. Các thủ tục được lưu trữ kỹ thuật đảo ngược
- 8. gọi thủ tục được lưu trữ từ solr
- 9. Thả nhóm các thủ tục được lưu trữ theo tên
- 10. Di chuyển các thủ tục được lưu trữ bằng Flyway
- 11. Bảng khóa SQLServer trong khi lưu trữ thủ tục
- 12. Thực hiện một thủ tục được lưu trữ trong một thủ tục lưu sẵn
- 13. thủ tục lưu trữ mysql để tìm kiếm từ các bảng giống hệt nhau
- 14. Thả tất cả các thủ tục được lưu trữ trong MySQL hoặc sử dụng các thủ tục được lưu trữ tạm thời
- 15. Làm thế nào tôi có thể lấy danh sách tham số từ thủ tục được lưu trữ trong SQL Server
- 16. Các thủ tục được lưu trữ là thời gian không liên tục!
- 17. Thủ tục được lưu trữ hoặc mã số
- 18. lưu trữ thủ tục trả về varchar
- 19. SELECT đối với thủ tục được lưu trữ SQL Server
- 20. thực hiện thủ tục lưu trữ từ một DbContext
- 21. Cách đơn giản để lập trình có được tất cả các thủ tục được lưu trữ
- 22. Đi qua một "trong" danh sách thông qua thủ tục lưu trữ
- 23. SQL Server lưu trữ mã thủ tục được lưu trữ ở đâu?
- 24. Các thủ tục lưu trữ Mysql Kiểu cột Tham chiếu
- 25. Mẫu để lưu các thủ tục?
- 26. Thủ tục lưu trữ MySQL Quyền
- 27. Thủ tục lưu trữ Vs. Xem
- 28. Làm cách nào để chuyển danh sách được phân tách bằng dấu phẩy sang một thủ tục được lưu trữ?
- 29. Thủ tục lưu trữ trong phpMyAdmin
- 30. Thủ tục lưu trữ không đồng bộ Các cuộc gọi
đ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
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. –
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 –