Làm thế nào để xác định tất cả các thủ tục được lưu trữ tham chiếu một bảng cụ thể


136

Tôi đã tạo một bảng về môi trường phát triển cho mục đích thử nghiệm và có một vài sp đang giới thiệu 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 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. Vui lòng đề xuất 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à máy chủ sql 2005.




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

Câu trả lời:


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

BTW - đây là một tài nguyên hữu ích cho loại câu hỏi này: Truy vấn Câu hỏi thường gặp về Danh mục Hệ thống Máy chủ SQL


3
Có bất kỳ lý do để làm điều này trên truy cập ROUTINE_DEFINITIONvào INFORMATION_SCHEMA.ROUTINES?
Marie

1
@Marie - SQL-Server 2005 (AFAIK) không có điều đó.
Chuỗi

2
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 chuỗi không? thích,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark 7/11/2016

1
@ Jeff.Clark - Có một cách dễ dàng để tìm hiểu :-) - nhưng vâng, nó tìm kiếm văn bản của thủ tục trực tiếp, vì vậy nó sẽ tìm thấy điều đó.
Chuỗi

2
yeah yeah :) Tôi sẽ mất một lúc để thiết lập bài kiểm tra, và tôi chỉ tìm kiếm một câu trả lời lười biếng / dễ dàng :)
Jeff.Clark

27

Các hoạt động sau đây trên SQL2008 trở lên. Cung cấp một danh sách cả 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

1
OP cần câu trả lời cho SQL-Server-2005
Chuỗi

19

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

EXEC sp_depends @objname = N'TableName';

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

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

18

Một cách không truy vấn sẽ là sử dụng Studio quản lý máy chủ Sql.

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

BIÊN TẬP

Nhưng, như các nhà bình luận đã nói, nó không đáng tin cậy lắm.


4
Trong năm 2005, thông tin phụ thuộc là không đáng tin cậy nếu các đối tượng không được tạo theo đúng thứ tự.
Martin Smith

3
Như @Martin Smith đã lưu ý, một quy trình được lưu trữ tham chiếu đến một đối tượng không tồn tại sẽ được tạo, mặc dù có cảnh báo, nhưng mục nhập không đượ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 một bảng trong cơ sở dữ liệu nước ngoài: Không có mục nào được đặt trong sysdepends trong cơ sở dữ liệu. Tính năng Antoher là việc thả / tạo lại bảng hoặc dạng xem sẽ phá vỡ chuỗi phụ thuộc. Các tính năng ... err ... này khiến cho việc theo dõi phụ thuộc của SQL Server trở nên vô dụng.
Nicholas Carey

7

Truy vấn sau đây sẽ tìm nạp tất cả các tên Thủ tục được lưu trữ và định nghĩa tương ứng của các SP đó

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

5
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 lưu ý rằng điều này cũng sẽ bật lên các SP có tên bảng trong các bình luận hoặc trong đó 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 "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.


2
Truy vấn syscommentstheo cách này không đáng tin cậy cho các thủ tục dài vì nó chia định nghĩa thành 4000 khối ký tự trên nhiều hàng. sys.sql_modulestránh điều này
Martin Smith

1
Điểm tốt. Tôi đã cập nhật nó để sử dụng sys.sql_modulesthay thế.
Tom H

3
syscomments đã được gỡ lỗi trong mỗi một trong số hàng tá câu trả lời của tôi cho cùng một câu hỏi stackoverflow.com/ cảm
gbn

5

Truy vấn dưới đây chỉ hoạt động khi tìm kiếm các phụ thuộc trên một bảng chứ không phải các truy vấn trên một cột:

EXEC sp_depends @objname = N'TableName';

Tuy nhiên, truy vấn sau đây là tùy chọn tốt nhất nếu bạn muốn tìm kiếm tất cả các loại phụ thuộc, nó không bỏ lỡ bất kỳ điều gì. Nó thực sự cung cấp nhiều thông tin hơn yêu cầu.

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

1
Đố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

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

GO

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


3

Trong studio quản lý, bạn có thể chỉ cần nhấp chuột phải vào bảng và nhấp để 'Xem phụ thuộc' nhập mô tả hình ảnh ở đây

hơn bạn có thể thấy một danh sách các Đối tượng có phụ thuộc với bảng của bạn:nhập mô tả hình ảnh ở đây


1

Về cơ bản, bạn có 2 tùy chọn:

----Lựa chọn 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

----Lựa chọn 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

2 truy vấn này sẽ giúp bạn có tất cả các thủ tục được lưu trữ đang tham chiếu bảng mà bạn mong muốn. Truy vấn này dựa trên 2 bảng sys là sysobjects và syscomments. Các sysobject là nơi lưu trữ tất cả các tên đối tượng DB của bạn, bao gồm các thủ tục được lưu trữ.

Các syscomments chứa văn bản cho tất cả các thủ tục của bạn.

Nếu bạn truy vấn: CHỌN * TỪ syscomments

Bạn sẽ có một bảng chứa id là ánh xạ tới bảng sysobjects với văn bản chứa trong các thủ tục được lưu trữ dưới dạng cột cuối cùng.


0

Thử cái này

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.