2016-02-24 45 views
2

比方說,我有一個存儲過程:牛逼SQL - 通過存儲過程傳遞表變量

exec my_sp ?,? 

我可以執行此存儲過程通過例如將兩個值

exec my_sp 'value 1','value 2' 

現在,這就是事情變得棘手.....

我有一個表例如

1 | 2 
aa bb 
cc dd 

等.......

現在我想通過我的表值並創建一個結果表,例如

exec my_sp 'aa','bb' 

exec my_sp 'cc','dd' 

等..........

我怎樣才能做到這一點?

+1

它黯然好像答案是使用遊標 – Lamak

+0

我[通行證變量作爲存儲過程參數]的Lamark –

+0

可能重複同意(http://stackoverflow.com/questions/34903923/pass-可變參數存儲過程) – cokeman19

回答

1

不幸的是,最簡單的方法是通過CURSOR。出於理智的原因,我將問題中的列從12更名爲AB

Declare @c_a varchar (10), 
     @c_b varchar (10) 

Declare cur Cursor For 
(
    Select A, B 
    From YourTable 
) 

Open cur 
While (1 = 1) 
Begin 
    Fetch Next From cur Into @c_a, @c_b 

    If (@@Fetch_Status <> 0) Break 

    Execute my_sp @c_a, @c_b 
End 
Close cur 
Deallocate cur 
+0

這可能不是執行此查詢的最有效方式,但是我的查詢是一次性的,因此我使用了遊標查詢但已聲明在開始時使用#temp_table,然後在插入到臨時表中的while子句中使用。歡迎您與Siyual一起爲您提供幫助,併爲名字不佳的例子列名道歉! – bepster

3

我建議你改變你的程序來接受table type作爲輸入參數而不是variables

然後,您可以將表中的所有值傳遞給過程中的一個鏡頭,併爲過程中的所有行完成工作。

創建表類型

Create type my_sp_param as table (col1 varchar(2),col2 varchar(2)) 

阿爾特程序

Alter procedure my_sp (@param my_sp_param) 
as 
.. 

要撥打與表型輸入

declare @param my_sp_param 

insert into @param (col1,col2) 
select [1],[2] from yourtable 

exec my_sp @param 

程序如果無法改變的過程,那麼你必須使用一個CURSOR或WHILE循環將每行作爲輸入傳遞給您的過程,這是極不推薦的。