【问题标题】:Which solution to execute the right stored procedure according to parameter根据参数执行正确的存储过程的解决方案
【发布时间】:2018-09-20 14:27:46
【问题描述】:

我发现了 2 个相同的 Q/A(根据我的说法),但给出的答案不同,所以我希望您对正确答案的意见(或者这实际上不是同一个问题......)

以下是问题:

您的应用程序包含每个国家/地区的存储过程。每个 存储过程通过 @EmpID 参数。您需要为每个员工构建一个流程 它将根据 居住国家。您应该使用哪种方法?

  1. 包含 CASE 的 SELECT 语句
  2. 光标
  3. 批量插入
  4. 查看
  5. 用户定义函数

正确答案:5(用户自定义函数)

第二个:

您的应用程序包含每个国家/地区的存储过程。每个 存储过程通过 @EmpID 参数。您计划为每位员工构建一个流程 这将基于 居住国家。您应该使用哪种方法?

  1. 递归存储过程
  2. 触发器
  3. 包含 CASE 的 UPDATE 语句
  4. 光标
  5. foreach SQLCLR 语句

正确答案:4(光标)

在我看来,Cursor 解决方案是正确的......

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    第一个有点奇怪。用于创建函数的documentation 明确表示:

    • 用户定义的函数不能调用存储过程,但可以调用扩展存储过程。

    不清楚作者的意图是什么,但我对答案(5)的问题规则的阅读。

    我可能不喜欢使用光标来完成这项工作,但在指定的选项中,它似乎是唯一适用的解决方案。

    【讨论】:

      【解决方案2】:

      关于第一个问题,您不能从选择、插入、视图或函数中调用存储过程,这样只会留下一个游标。但这是一个糟糕的答案。游标不是“单个进程”。它是一个指针,一个可以在单个进程中使用的工具。因此,如果您使用游标来遍历一系列员工记录,您可能处于存储过程中。

      对我来说,这就是答案,“存储过程”,它包含在你的第二个问题中。在第二个问题中,它说“递归存储过程”。递归部分让我很困扰,因为存储过程确实不需要需要递归调用另一个存储过程。所以问题 2 的选项 1 还不错,但有问题。

      我排除了第二个问题的选项 3,4 和 5,原因与我排除了问题 1 中的所有选项相同。这就留下了触发器。您完全有可能在每次插入或更新新员工时运行的触发器上调用此国家/地区存储过程。这可能是一个很好的解决方案,具体取决于应用程序。所以问题 2 有一个半好的答案(#2 和 #1)。

      最重要的是,问题 1 没有真正好的答案,问题 2 有两个至少是半可接受的。如果是我问这个问题,我会使用问题 1 中的选项,但将选项 2(光标)替换为“A 存储过程”。

      【讨论】:

      • 也感谢您提供有用的反馈
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多