2017-04-03 23 views
5

Belirli saklı yordamlarda kullanılan tüm veritabanı tablolarının adını almam gerekiyor mu?Özellikle saklı yordamda kullanılan tüm tablo (lar) adı nasıl alınır?

Örnek olarak, Aşağıda verilen bir saklı yordamım var.

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 

Beklenen çıkışı:

Used_Table_Name

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

Herhangi biri bir yol önerebilir mi? komut altında

+1

'exec sp_depends [ProcedureName]' – artm

+1

@artm, yorum için teşekkürler, Onun dönüşü kullanılan veritabanı nesnelerinin her türü. Ayrıca, ayrı bir değer döndürmez. –

+1

[Mansoor'un cevabı] (http://stackoverflow.com/a/43177867/15498), [* eski görüntüler *] kullanılmadığından daha iyi bir seçenek olabilir (https://technet.microsoft.com/en- yeni yazılmış bir kodda kullanmamanız gereken/kütüphane/ms190325 (v = sql.110) .aspx) –

cevap

2

kullanın mağaza prosedüründe tablo adlarını almak için: sorgusu Aşağıda

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

saklı yordamda kullanılan veritabanı tabloları almak için yardımcı olacaktır.

;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