2017-04-03 33 views
5

Mam wymóg uzyskania wszystkich nazw tabel bazy danych, które są używane w określonej procedurze przechowywanej?Jak uzyskać nazwy wszystkich tabel, które są używane w konkretnej procedurze przechowywanej?

Jako przykład, Mam jedną procedurę przechowywaną, jak podano poniżej.

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 

oczekiwany wynik:

Used_Table_Name

  1. TBL1
  2. TBL2
  3. tbl3
  4. tbl4

Czy ktoś może sugerować sposób?

+1

'exec sp_depends [ProcedureName]' – artm

+1

@artm, dzięki za komentarz, jej zwrotu wszystkich rodzajów obiektów bazy danych, które są używane. Również nie zwraca wyraźnej wartości. –

+1

[Odpowiedź Mansoor] (http://stackoverflow.com/a/43177867/15498) byłby lepszym wyborem, ponieważ nie używa [* starszych widoków *] (https://technet.microsoft.com/en- us/library/ms190325 (v = sql.110) .aspx), którego nie powinno się używać w żadnym nowo napisanym kodzie –

Odpowiedz

2

skorzystać z poniższego skryptu, aby uzyskać nazwy tabel w procedurze sklepu:

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

Poniżej zapytania pomoże Ci przyzwyczaić tabele bazy danych w procedurze przechowywanej.

;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