2012-06-16 61 views
4

我有一些關於在SQL Server中執行存儲過程的情況。按順序執行SQL Server存儲過程

也許這是一種不尋常的做法,但我在表中存儲了一個存儲過程名稱列表。該表是關於這樣的(我們稱之爲TableFoo):

| SPId | SPName | 
------------------- 
| 1 | spr_name1| 
| 2 | spr_name2| 
| 3 | spr_name3| 
| 4 | spr_name4| 
... 

我想調用/執行從查詢結果產生的TableFoo存儲過程的列表,查詢是關於這樣的:

SELECT SPName 
FROM TableFoo 
WHERE SPId IN (1, 2, 3) 

我想執行存儲過程的順序每行

我的意思是我想做到這一點:)

SELECT EXEC(SpName) 
FROM TableFoo 
WHERE SPId IN (1, 2, 3) 

但這不起作用

它是除了使用CURSOR之外的任何解決方案嗎?

在此先感謝。

+0

你希望通過這個完成什麼? –

+0

@Chirs,我想從查詢結果中執行存儲過程列表 –

回答

5

建立一個單一批次調用所有的程序,用串聚集,然後運行這個批處理。有許多串aggreate拼接方法,但最有效的一種是XML blackbox method

這一切
create table #test (spid int, sproc sysname); 
insert into #test (spid, sproc) values (1, N'sproc1') 
    , (2, N'sproc2') 
    , (3, N'sproc3') 
    , (4, N'sproc4') 
    , (5, N'sproc5') 
    , (6, N'sproc6'); 

declare @sql nvarchar(max); 
set @sql = (select N'exec ' + sproc +N'; 
' from #test 
where spid in (1,3,5) for XML path(''), type).value(N'.', 'nvarchar(max)'); 

exec sp_executesql @sql; 
0

您無法在選擇查詢中執行。光標可以讓你滿足你的需求,但是,它確實看起來過於複雜。如果你正在開發一個應用程序,你可能想把這個邏輯放在更高的架構中。

問候

0
Declare @SPCall table 
(id int,SP varchar(20)) 

Insert into @SPCall 
values 
(1,'sp1'),(2,'sp3'),(3,'sp3') 



    Declare @spName varchar(20) 
    Declare @value int 
    set @value =1 

    While @value<=(Select COUNT(*) from @SPCall) 
    BEGIN 
    Set @spName=(select Sp from @SPCall where [email protected]) 
    exec @spName 
    set @[email protected] +1 
    END 
0

首先是不是一個好方法。但是如果你堅持這樣去,你可以在存儲過程中使用動態sql。將所有SP名稱的列表轉儲到臨時表中,並使用該表上的循環將每個sp名稱傳遞給dynsmic sql查詢。動態構建T-SQL語句可以使用EXECUTE命令或sp_executesql語句執行。我建議你去後者,即sp_executesql。

用於使用sp_executesql的基本語法:

sp_executesql [@SQLStatement],[@ParameterDefinitionList],[@ParameterValueList] 

@ParameterDefinition用於執行SQL字符串之前,以指定的參數的格式。你可以在google上獲得很多例子。希望有所幫助。

0

我有另一種選擇太

DECLARE @SQL VARCHAR(8000) 

SELECT @SQL='' 

SELECT @SQL = @SQL+ 'Exec ' + b.SPname 
FROM TbFoo 
WHERE SpId IN (1,2,3) 

EXEC(@SQL) 

但它是不夠好?