2017-04-03 12 views
5

Tôi có yêu cầu nhận tất cả tên bảng cơ sở dữ liệu được sử dụng trong quy trình được lưu trữ cụ thể?Làm thế nào để có được tất cả (các) tên bảng được sử dụng trong quy trình được lưu trữ cụ thể?

Ví dụ: Tôi có một quy trình được lưu trữ như được đưa ra bên dưới.

CREATE PROCEDURE [dbo].[my_sp_Name] 
    @ID INT = NULL 
AS 
BEGIN 

    SELECT ID, NAME, PRICE 

    FROM tbl1 
    INNER JOIN tbl2 ON tbl1.ProductId = tbl2.ProductId 
    LEFT JOIN tbl3 ON tbl2.ProductSalesDate = tbl3.ProductSalesDate 
    LEFT JOIN tbl4 ON tbl1.ProductCode = tbl4.ItemCode 
END 

sản lượng dự kiến:

Used_Table_Name

  1. tbl1
  2. tbl2
  3. tbl3
  4. tbl4

Có thể ai đề xuất một cách?

+1

'exec sp_depends [ProcedureName]' – artm

+1

@artm, Cảm ơn nhận xét, Trả về tất cả các loại đối tượng cơ sở dữ liệu được sử dụng. Ngoài ra nó không trả về giá trị khác biệt. –

+1

[Câu trả lời của Mansoor] (http://stackoverflow.com/a/43177867/15498) sẽ là một lựa chọn tốt hơn vì nó không sử dụng [* legacy views *] (https://technet.microsoft.com/en- chúng tôi/thư viện/ms190325 (v = sql.110) .aspx) mà bạn không nên sử dụng trong bất kỳ mã mới được viết nào –

Trả lời

2

Sử dụng dưới kịch bản để có được tên bảng trong thủ tục lưu trữ của bạn:

SELECT DISTINCT [object_name] = SCHEMA_NAME(o.[schema_id]) + '.' + o.name 
     , o.type_desc 
    FROM sys.dm_sql_referenced_entities ('[dbo].[Your_procedurename]', 
    'OBJECT')d 
    JOIN sys.objects o ON d.referenced_id = o.[object_id] 
    WHERE o.[type] IN ('U', 'V') 
3

Dưới truy vấn sẽ giúp bạn để có được bảng cơ sở dữ liệu được sử dụng trong thủ tục lưu trữ.

;WITH stored_procedures AS ( 
    SELECT oo.name AS table_name, 
    ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row 
    FROM sysdepends d 
    INNER JOIN sysobjects o ON o.id=d.id 
    INNER JOIN sysobjects oo ON oo.id=d.depid 
    WHERE o.xtype = 'P' AND o.name = 'my_sp_Name' 
) 
SELECT Table_name AS 'Used_Table_Name' FROM stored_procedures 
WHERE row = 1 
Các vấn đề liên quan