【问题标题】:Stored procedure to call a different stored procedure based on parameter存储过程根据参数调用不同的存储过程
【发布时间】:2013-04-08 12:20:36
【问题描述】:

我想在 Sql Server 中创建一个存储过程,它调用多个不同存储过程之一并根据提供给它的参数选择哪一个,但我似乎无法正确选择语法。

目前正在尝试:

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

这目前告诉我:'param' 附近的语法不正确。

我看过这里:conditional where clause based on a stored procedure parameter?,但我不知道如何更改该代码以适应我的情况。

如何为存储过程提供参数,然后使用它来选择和运行不同的存储过程?

【问题讨论】:

  • iif 在 SQL 2008 中不存在,即只有 SQL 2012。
  • 所以我使用 2012 客户端和 2008 服务器会导致问题,你认为吗?
  • 2008 服务器不支持它,但您可以使用 CASE 语句为您的逻辑完成此操作。

标签: sql-server sql-server-2008 stored-procedures


【解决方案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

【讨论】:

  • 你的 Execute 行有点困惑。我的 sp 创建语法似乎有点不同。例如,模板没有在参数的开头表明需要“声明”。您的建议是否应该介于 SP 的开始和结束之间?
  • @mcalex 第一个选项是将存储过程的名称存储在一个变量中以在最后执行。由于您不需要动态 sql,因此您应该发现只需使用 IF ELSE... 语法实现底部选项。
  • @mcalex 是的,我在答案周围添加了BEGIN...END,以便您更清楚。
【解决方案2】:
BEGIN 
 IF param = "individual" 
   EXEC Sp_findindividualrespondents; 

 IF param = "org" 
   EXEC Sp_findorgrespondents; 

 IF param = "Nothing" 
   EXEC Sp_findgrouprespondents; 
END 

或

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

【讨论】:

    猜你喜欢
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多