2015-09-03 64 views
1

我想創建一個存儲過程來執行架構中的所有存儲過程。這是我有:執行一組存儲過程

ALTER procedure [ALL_IC].[EXECUTE_ICS] 
    @sql nvarchar(max) = null, 
    @fa nvarchar(max) = null 
as 
begin 
    set @sql = ('select (select ''EXEC [IC].['' + b.name + ''];'' 
         from sys.procedures b 
         join sys.schemas s on s.schema_id = b.schema_id 
         where s.name = ''IC'' 
         for xml path(''''))' 
         ) end 

    EXECUTE sp_executesql @sql 

運行此選擇字符串來執行所有的存儲過程,但它並沒有實際執行它們。

EXEC ALL_IC.EXECUTE_ICS 

如何通過運行該代碼行來實際執行所有存儲過程?

SQL Server 2012的

+1

如果存儲過程需要參數該怎麼辦? – lad2025

+0

@ lad2025我正在執行的人不需要參數。 – bheltzel

+1

這聽起來像一個糟糕的設計。盲目地運行架構中的每個過程聽起來像是一場災難。這裏有很多「假設」。 –

回答

1

除了無數可怕的事情這讓人們想起了實際的邏輯很簡單。您只需構建一個動態字符串並執行它。

這是一個非常簡單的方法,你可以做到這一點。

declare @SQL nvarchar(max) = '' 

select @SQL = @SQL + 'EXEC ' + quotename(s.name) + '.' + quotename(b.name) + ';' 
from sys.procedures b 
join sys.schemas s on s.schema_id = b.schema_id 
where s.name = 'IC' 

select @SQL 
--exec sp_executesql @SQL 

- 編輯 -

稍微改變,該模式並不難動態SQL內編碼。這樣,如果你想要一個不同的模式,只需更改模式名稱,其他所有模式仍然可以工作。

--Second Edit--

改變,而不是使用在[]硬編碼QUOTENAME。這更加靈活和穩定。

+0

工程很棒。謝謝。 – bheltzel

0

爲了確保您沒有執行任何需要參數的過程,我在系統目錄sys.parameters上添加了一點檢查。其餘的幾乎和你在你的問題中試圖做的一樣。

Declare @sql NVARCHAR(MAX); 


SELECT @sql = STUFF((SELECT ' Exec ' + QUOTENAME(s.name) +'.'+ QUOTENAME(p.name) + '; ' 
       FROM sys.procedures P 
       INNER JOIN sys.schemas S ON P.schema_id = S.schema_id 
       WHERE s.name = 'IC' 
       AND NOT EXISTS (SELECT 1 
            FROM sys.parameters pm 
            WHERE p.object_id = pm.object_id) 
       FOR XML PATH('')),1,2,''); 

Exec sp_executesql @sql