2011-09-01 32 views
73

Tôi đã tạo một bảng trên môi trường phát triển cho mục đích thử nghiệm và có vài sp đang refreing bảng này. Bây giờ tôi phải bỏ bảng này cũng như xác định tất cả các sp đang tham chiếu đến bảng này. Tôi đang gặp khó khăn để tìm danh sách của tất cả các sp's. Xin gợi ý một số truy vấn bằng cách giả sử rằng tên bảng là 'x' và cơ sở dữ liệu là SQL Server 2005.Làm thế nào để xác định tất cả các thủ tục lưu trữ tham chiếu đến một bảng cụ thể

+0

bản sao có thể có của [SQL Server 2005 - Tìm Procs đã lưu trữ nào chạy đến bảng cụ thể] (http://stackoverflow.com/questions/3361141/sql-server-2005-find-which-stored-procs-run- to-a-specific-table) –

+0

có thể trùng lặp của [làm thế nào để tìm kiếm thủ tục lưu trữ Sql Server 2008 R2 cho một chuỗi?] (http://stackoverflow.com/questions/6354256/how-to-search-sql-server- 2008-r2-được lưu trữ-thủ tục-cho-một-chuỗi) hoặc http://stackoverflow.com/questions/3991030/searching-in-sql-management-studio-2005/3991077#3991077 – gbn

+0

cho các chuyên gia: làm thế nào về một máy chủ không phải MS SQL? – Deian

Trả lời

137
SELECT Name 
FROM sys.procedures 
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%' 

BTW - đây là một nguồn tài nguyên có ích cho loại câu hỏi: http://msdn.microsoft.com/en-us/library/ms345522%28v=SQL.90%29.aspx

+1

Có bất kỳ lý do để làm điều này qua truy cập vào 'ROUTINE_DEFINITION 'on' INFORMATION_SCHEMA.ROUTINES'? – Marie

+0

@Marie - SQL-Server 2005 (AFAIK) không có. – Chains

+0

Câu hỏi, giải pháp này có tìm thấy các đối tượng được tham chiếu khi chúng được tham chiếu * bên trong * của một chuỗi không? như, 'set @Query =" SELECT * FROM Object_I_Need_To_Find_References ... "; ' –

3
SELECT 
    o.name 
FROM 
    sys.sql_modules sm 
INNER JOIN sys.objects o ON 
    o.object_id = sm.object_id 
WHERE 
    sm.definition LIKE '%<table name>%' 

Chỉ cần ghi nhớ rằng điều này cũng sẽ bật lên SPs nơi tên bảng là trong các ý kiến ​​hoặc trong trường hợp tên bảng là một chuỗi con của tên bảng khác đang được sử dụng. Ví dụ: nếu bạn có các bảng có tên là "test" và "test_2" và bạn cố gắng tìm kiếm SP bằng "test" thì bạn sẽ nhận được kết quả cho cả hai.

+1

Truy vấn 'syscomments' theo cách này không đáng tin cậy đối với các quy trình dài vì nó chia tách định nghĩa thành 4000 khối ký tự trên nhiều hàng. 'sys.sql_modules' tránh điều này. –

+0

Điểm tốt. Tôi đã cập nhật nó để sử dụng 'sys.sql_modules' thay thế. –

+2

syscomments đã được debunked trong mỗi một tá của tôi hoặc như vậy câu trả lời cho cùng một câu hỏi http://stackoverflow.com/search?tab=votes&q=user%3a27535%20syscomments – gbn

13

Một cách không truy vấn sẽ được sử dụng SQL Server Management Studio.

Định vị bảng, nhấp chuột phải và chọn "Xem phụ thuộc".

EDIT

Nhưng, như các bình luận nói, nó không phải là rất đáng tin cậy.

+3

Năm 2005 thông tin phụ thuộc không đáng tin cậy nếu các đối tượng không được tạo theo thứ tự đúng. –

+1

Khi @Martin Smith lưu ý, một thủ tục được lưu trữ tham chiếu đến một đối tượng không tồn tại sẽ được tạo ra, mặc dù có cảnh báo, nhưng không phải mục nhập sẽ được đặt trong sysdepends. Ngoài ra, điều tương tự cũng đúng đối với các thủ tục được lưu trữ tham chiếu đến một bảng trong cơ sở dữ liệu nước ngoài: Không có mục nhập nào được đặt trong các sysdepends trong một trong hai cơ sở dữ liệu. Tính năng Antoher là việc thả/tạo lại một bảng hoặc khung nhìn sẽ phá vỡ chuỗi phụ thuộc. Những tính năng ... err ... làm cho sự phụ thuộc của SQL Server theo dõi khá nhiều vô dụng. –

18

Các công trình sau đây trên SQL2008 trở lên. Cung cấp danh sách các thủ tục và chức năng được lưu trữ.

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc 
    from sys.objects o inner join sys.sql_expression_dependencies sd on o.object_id = sd.referenced_id 
       inner join sys.objects sp on sd.referencing_id = sp.object_id 
        and sp.type in ('P', 'FN') 
    where o.name = 'YourTableName' 
    order by sp.Name 
+0

OP cần câu trả lời cho SQL-Server-2005 – Chains

4

Các truy vấn sau đây sẽ lấy tất cả các tên Stored Procedure và định nghĩa tương ứng của những người của SP

select 
    so.name, 
    text 
from 
    sysobjects so, 
    syscomments sc 
where 
    so.id = sc.id 
    and UPPER(text) like '%<TABLE NAME>%' 
9

đôi khi trên các truy vấn sẽ không cho kết quả chính xác, có được xây dựng trong thủ tục lưu trữ có sẵn để có được bàn phụ thuộc như:

EXEC sp_depends @objname = N'TableName'; 
+0

Không hoạt động với Sql Azure –

+0

Đối với tôi, điều này cho thấy trình kích hoạt và chế độ xem nhưng không được lưu trữ procs. – NealWalters

+0

LƯU Ý: Tôi chạy trên hệ thống mà tôi có quyền truy cập vào các bảng, nhưng không phải Procs được lưu trữ, do đó, tất nhiên các Procs được lưu trữ không hiển thị trong kết quả. – NealWalters

4

dưới đây truy vấn là công việc chỉ dành cho bảng không cho cột

EXEC sp_depends @objname = N'TableName'; 

dưới đây truy vấn là tốt nhất nó không bỏ lỡ bất cứ điều gì nó mang lại cho phụ trợ nhưng không sai

select distinct 
     so.name 
     --, text 
    from 
     sysobjects so, 
     syscomments sc 
    where 
    so.id = sc.id 
    and lower(text) like '%organizationtypeid%' 
    order by so.name 
+0

Đối với tôi, không trả lại bất cứ điều gì trên SSMS 2014 chạy với cơ sở dữ liệu trên SQL Server 12.0) – NealWalters

0
SELECT DISTINCT OBJECT_NAME(OBJECT_ID), 
object_definition(OBJECT_ID) 
FROM sys.Procedures 
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%' 

GO 

này sẽ làm việc nếu bạn có đề cập đến tên bảng.

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