2012-10-31 22 views
2

我有驗證一定的銀行帳戶信息對於給定帳戶SQL存儲過程「A」和它接受帳戶號碼作爲參數「ARG1」SQL - 在表中執行的存儲過程對於所有的值

我要執行的程序,我不知道目前在列中的另一臺XXXX(所有銀行賬戶出現在賬戶表)

所有的值,如果這樣的事情會工作

exec A @arg1 = X from XXX 

在此先感謝!

+0

「A」的目的是什麼?這聽起來像你試圖通常是一個否定的光標。你能詳細說明你的前/後數據是/應該是什麼嗎? – Bmo

+0

http://stackoverflow.com/questions/1656804/sql-call-stored-procedure-for-each-row-without-using-a-cursor – jazzytomato

+0

看看TVF + CROSS APPLY是否有幫助http://stackoverflow.com/questions/477064/is-it-it-it-it-it-it-the-execution-a-stored-procedure-a-set-without-use-a-cursor –

回答

10

不,沒有一個批量EXEC就是你想要運行它的方式。

選項1:手動生成並運行。複製結果,粘貼回SSMS並執行。

select 'exec A @arg1 = ' + quotename(X,'''') + ';' 
from XXX 

選項2:生成批處理並使用動態SQL運行。

declare @sql nvarchar(max); 
set @sql = ''; 
select @sql = @sql + 'exec A @arg1 = ' + quotename(X,'''') + ';' 
from XXX; 
exec (@sql); 

方案三:在一個循環中

declare @x varchar(max); 
select top(1) @x = X from xxx where X is not null order by X; 
while @@rowcount > 0 
begin 
    exec sp_executesql N'exec A @[email protected];', N'@x varchar(max)', @[email protected]; 
    select top(1) @x = X from xxx where X > @x order by X; 
end; 
+0

謝謝,循環解決方案做我在找什麼 – dopplesoldner

+0

選項1爲我做了。 +1 –

2

這是通常更接近事物在基於集合的方式運行,但如果你真的需要爲在每一行做順序的東西結果集,以下是如何使用光標:

declare cur cursor for 
select X from XXX 

declare @x int 
open cur 
fetch next from cur into @x 

while @@FETCH_STATUS = 0 
BEGIN 
    exec A @x 

    fetch next from cur into @x 
END 
+0

我需要做同樣的事情:對錶中每行的值運行存儲過程。以基於集合的方式思考這個問題的方法是什麼? – bernie2436

+0

@ akh2103這真的取決於你的sproc的功能。您可能可以根據相關的更新,刪除或插入來重寫它。如果它包含變量,則用表變量替換它們。或者它可能不可行或值得付出努力。 – Chad