iT邦幫忙

0

[已解決]遞迴如何加入依據條件式判斷去呼叫不同的方法

因為是分別呼叫Function與StoredProcedure,可以改由cursor的方式作業。

如下為原本的問題內容

//-------------------------------------------------

如標題簡述,想詢問如何撰寫一段SQL
假設我自己是一個方法叫做Function_A(),我這個方法裡面會依據條件呼叫兩個方法,分別叫做Function_B()StoredProcedure_C
當我符合以下條件我就重複個別呼叫方法

  • isCall=1呼叫Function_B()
  • isCall=0呼叫StoredProcedure_C() <--會操作insert、delete、update,故使用SP

不好意思我詢問得很模糊,假設先不理Function_A()Function_B()StoredProcedure_C實際再做什麼以及其目的性,想先知道一個架構或概念即可。

以下這個寫法想表達的概念是,一開始會呼叫Function_B(variableA)
再用這個表的內容做為依據,只要符合條件isCall=1就一直呼叫Function_B(variableA)
( variableA只是先假定會傳入一個變數 )
若我要達成上述所敘,要怎麼運用遞迴去撰寫SQL呢?

;with cte as (
		select 
			* 
		from 
			Function_B(variableA)
	)	
    select 
        x.* 
    from 
        cte x
    union all
    select 
        z.* 
    from 
        cte y
    cross apply Function_B(variableA) z
    where y.isCall = 1
babyhello iT邦新手 5 級 ‧ 2019-03-19 15:47:25 檢舉
While 不能做嗎?
anniecat iT邦新手 5 級 ‧ 2019-03-19 15:57:13 檢舉
好像也可以,只是還沒想到做法...
如果可以看到多元的解法也很好的~

1 個回答

1
暐翰
iT邦大師 2 級 ‧ 2019-03-20 10:57:23

使用case when,舉例有兩個function分別是加法跟減法動作

create function function_Add (@p1 int,@p2 int)
returns int
begin
    return @p1 + @p2;
end;

create function function_Sub (@p1 int,@p2 int)
returns int
begin
    return @p1 - @p2;
end;


with cte as (
	select 'Add' action,1 p1,1 p2 union all
	select 'Sub' action,1 p1,1 p2 
)
select 
	case action when 'Add' then dbo.function_Add(p1,p2)
	when 'Sub' then dbo.function_Sub(p1,p2)
	end result
from cte


20190320105813-image.png


測試連結 db<>fiddle

anniecat iT邦新手 5 級 ‧ 2019-03-20 11:09:40 檢舉

謝謝您耐心的瀏覽與回覆!
這個方法我原本也有嘗試,但發現若是呼叫Store procedure就不能使用select case的方式,不知道有沒有方法可以依據不同的條件分別重複呼叫Function與Store procedure呢?

不好意思,提問內容沒有敘述清楚,再更新我所提問的問題~

暐翰 iT邦大師 2 級 ‧ 2019-03-20 11:57:14 檢舉

不能,SP不能在select中呼叫
把SP行為改寫成function

anniecat iT邦新手 5 級 ‧ 2019-03-20 15:23:39 檢舉

因為會進行INSERT、UPDATE與DELETE操作,所以會用到SP,正尋覓如何達到需求...
再次謝謝您的範例,測試連結所使用的網頁也很方便!

我要發表回答

立即登入回答