2017-04-03 44 views
5

我必須得到所有這些都在特定的存儲過程中使用的數據庫表名的要求?如何讓它們在特定存儲過程中使用的所有表(S)的名字嗎?

作爲一個例子,我有一個存儲的過程如下面給出的。

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 

預期輸出:

Used_Table_Name

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

任何一個可以提出一個方法?下面的腳本

+1

'exec sp_depends [ProcedureName]' – artm

+1

@artm,感謝評論,它返回使用的所有類型的數據庫對象。也不會返回明顯的價值。 –

+1

[曼蘇爾的答案](http://stackoverflow.com/a/43177867/15498)會是一個更好的選擇,因爲它不使用[*傳統看法*](https://technet.microsoft.com/en-我們/庫/ ms190325(v = sql.110)的.aspx),你不應該使用在任何新的代碼 –

回答

2

用它來獲得表名的存儲過程中:

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

下面的查詢將幫助你獲得在存儲過程中使用的數據庫表。

;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 
相關問題