2012-10-26 105 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