2012-10-26 49 views
1

調用另一個存儲過程的存儲過程我想在Sql Server中創建一個存儲過程,它調用多個不同的存儲過程之一,並根據提供給它的參數選擇哪一個,但我可以好像沒有選擇正確的語法。根據參數

目前嘗試:

Begin 
    Set nocount on; 
    exec iif(param='individual', sp_FindIndividualRespondents, 
     iif(param='org', sp_FindOrgRespondents, sp_FindGroupRespondents)) 
End 

這是目前在告訴我:Incorect附近的語法 'PARAM'。

我在這裏看過:conditional where clause based on a stored procedure parameter?,但我無法弄清楚如何更改該代碼以適應我的情況。

如何向存儲過程提供參數,然後使用它來選擇和運行不同的存儲過程?

+0

IIF不會在2008年SQL存在,即SQL 2012Ø NLY。 –

+0

因此,我使用2012年客戶端與2008服務器導致問題,你覺得呢? – mcalex

+0

2008服務器將不支持它,但您可以使用CASE語句爲您的邏輯完成此操作。 –

回答

1
BEGIN 
SET NOCOUNT ON; 

    DECLARE @queryToRun NVARCHAR(128) = 'EXECUTE '; 

    SELECT @queryToRun = @queryToRun + CASE 
             WHEN param = 'individual' 
              THEN 'sp_FindIndividualRespondents' 
             WHEN param = 'org' 
              THEN 'sp_FindOrgRespondents' 
             ELSE 'sp_FindGroupRespondents' 
             END 

    EXECUTE sp_executesql @queryToRun; 
END 

如果您不需要動態SQL,它出現在這個例子中,你不這樣做,你可以簡單地檢查值和運行相應的存儲過程:

BEGIN 
SET NOCOUNT ON; 

    IF param = 'individual' 
     EXECUTE sp_findIndividualRespondents; 
    ELSE IF param = 'org' 
     EXECUTE sp_FindOrgRespondents; 
    ELSE 
     EXECUTE sp_FindGroupRespondents; 
END 
+0

一個li'l混淆在你的執行線。我的sp創建語法看起來有些不同。例如,該模板並不表示在參數開頭需要「申報」。你的建議是否應該在SP的開始和結束之間進行? – mcalex

+0

@mcalex第一個選項是將sproc的名稱存儲在變量中以在最後執行。既然你不需要動態sql,你應該找到只用'IF ELSE ...'語法實現底部選項。 –

+0

@mcalex是的,我在我的回答周圍添加了「BEGIN ... END」,對您更加清楚。 –

1
BEGIN 
IF param = "individual" 
    EXEC Sp_findindividualrespondents; 

IF param = "org" 
    EXEC Sp_findorgrespondents; 

IF param = "Nothing" 
    EXEC Sp_findgrouprespondents; 
END 

OR

BEGIN 
IF param = "individual" 
    EXEC Sp_findindividualrespondents; 
ELSE IF param = "org" 
    EXEC Sp_findorgrespondents; 
ELSE 
    EXEC Sp_findgrouprespondents; 
END