根据参数执行正确存储过程的解决方案

时间:2015-08-18 13:17:35

标签: sql sql-server tsql

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

以下是问题:

  

您的应用程序包含每个国家/地区的存储过程。每   存储过程通过以下方式接受员工标识号   @EmpID参数。您需要为每个员工构建一个流程   将执行基于的适当的存储过程   居住国家。你应该使用哪种方法?

     
      
  1. 包含CASE
  2. 的SELECT语句   
  3. 光标
  4.   
  5. BULK INSERT
  6.   
  7. 查看
  8.   
  9. 用户定义的功能
  10.         

    正确答案:5(用户定义的功能)

第二个:

  

您的应用程序包含每个国家/地区的存储过程。每   存储过程通过以下方式接受员工标识号   @EmpID参数。您计划为每个员工构建一个流程   将执行基于的存储过程   居住国家。你应该使用哪种方法?

     
      
  1. 递归存储过程
  2.   
  3. 触发
  4.   
  5. 包含CASE
  6. 的UPDATE语句   
  7. 光标
  8.   
  9. foreach SQLCLR声明
  10.         

    正确答案:4(光标)

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

2 个答案:

答案 0 :(得分:4)

第一个有点奇怪。创建函数的documentation明确地说:

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

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

我可能不喜欢光标用于工作,但是对于指定的选项,它似乎是唯一适用的解决方案。

答案 1 :(得分:2)

在第一个问题上,您无法从选择,插入,视图或函数调用存储过程,因此只留下光标。但这是一个糟糕的答案。光标不是"单个进程"。它是一个指针,一个可以在单个进程中使用的工具。因此,如果使用游标,循环遍历一系列员工记录,则可能是在存储过程中。

对我来说,这将是答案,"存储过程",它包含在你的第二个问题中,有点像。在第二个问题中它表示"递归存储过程"。递归部分困扰我,因为存储过程需要递归调用另一个存储过程。所以问题2中的选项1是中等的,但有问题。

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

底线,问题1没有真正好的答案,问题2有两个至少是半可接受的。如果是我问这个问题,我会使用问题1中的选项,但用"存储过程"替换选项号2(光标)。