2011-12-07 83 views
3

有沒有辦法掃描SQL Server來查找所有存儲過程,讀取它們的正文並確定它們使用的表的列表?我的目的是對大型遺留數據庫執行分析。 (SQL服務器2008 R2,最好是C#,但語言是無關緊要)。解析存儲過程

+0

Answer也許在這裏編輯? http://stackoverflow.com/questions/1916489/how-to-write-a-query-for-sql-server-2008-that-returns-the-dependencies-of-an-obj –

+0

一些提示在這裏的評論:http://forums.asp.net/t/1225902.aspx我們在我們的數據庫做類似的事情,雖然我們已經修改它使用一些專有代碼,所以我不能發佈它。我們的版本讓我們可以搜索服務器上的所有數據庫,或者只搜索我們使用變量發送的數據庫。 。 – HLGEM

回答

3

充分利用SQL Server的sp_depends系統存儲過程。

1)獲取所有存儲過程的列表。

select specific_name from information_schema.routines 
where routine_type='PROCEDURE' and specific_name not like 'sp_%' 

2)使用與sp_depends沿着這個列表,並插入其結果插入表中。

declare @t table([name] varchar(50),[type] varchar(50), 
updated varchar(10),selected varchar(10),[column] varchar(50)) 

insert into @t exec sp_depends 'MyProc1'; 
insert into @t exec sp_depends 'MyProc2'; 
insert into @t exec sp_depends 'MyProc3'; 

select [name] from @t group by [name]; 

More on sp_depends

+0

雖然這對跨數據庫依賴關係不起作用。 – JNK

+0

@JNK:我錯過了OP希望跨數據庫功能的部分。 –

+0

他沒有提到它,但我想指出'sp_depends'不會準確地報告數據庫之間的依賴關係。 – JNK

0

不知道這是否可以幫助,但你可以在對象資源管理器SQL Management Studio中任何數據庫上單擊鼠標右鍵,使用任務 - - >生成腳本生成一個包含所有存儲特效(或任何對象)的大型腳本。在這一點上,它只是一個文本文件,你可以解析任何你想要的。

+0

我的印象是OP想要在大型數據庫上實現這種自動化或半自動化的方式,這聽起來有點麻煩...... – MJB

+0

她的第一句話意味着多個數據庫,然而她接着提到一個單一的大型數據庫 - 「我的目的是對大型遺留數據庫進行分析。」因爲我知道這個方法適用於單個數據庫而不會非常麻煩,所以我想我會提出這個建議。 – Terry

0

我想這可能工作:

 
SELECT 
    routine_name, 
    routine_definition 
FROM information_schema.routines 
WHERE routine_definition in (SELECT '%' +name+ '%' FROM sys.tables) 
     AND routine_type IN ('function', 'pocedure') 
0

是對於前兩點是肯定的:

SELECT 
    pr.Name, 
    mod.Definition 
FROM sys.procedures pr 
INNER JOIN sys.sql_modules mod ON pr.object_id = mod.object_id 

一旦你的存儲過程體(在sql_modules,列definition),您可以解析它 - 但這將有點凌亂至多 - 不知道是否有更方便的方法來做到這一點...