具有多个选择的存储过程-与客户端工具的交互?

时间:2019-03-21 22:09:09

标签: sql-server stored-procedures multiple-select

假设我有如下存储过程:

create procedure p_x
as
begin
   select 'a','b','c'
   select 'c','d','e'
   select 'e','f','g'
end
go

这当然不是真正的代码,但是它足以说明问题,可以提出我的问题。

我正在寻找最好的性能和最佳实践来解决它。

  1. 调用此过程的客户端工具(例如Informatica Data Quality)如何反应?

    • 它将收到3个单独的结果,只是最后一个查询结果还是一次收到所有结果?
    • 是否将每个单独的查询直接发送到客户端(过程将暂停直到完成)?还是在程序完成后完成?
    • 以这种方式工作是一种好习惯吗?我一直在寻找OUTPUT表类型参数的交换,但是如果我是正确的(基于其他故事)(仅作为输入),这似乎是不可能的。
    • 这样会对性能产生影响吗?如果可以的话,怎样才能做到尽可能高效(例如,仅将结果发送回客户端)

1 个答案:

答案 0 :(得分:0)

将问题发布到Informatica论坛会更好。他们应该能够准确,准确地回答您的问题。但我会努力的。

该工具将如何反应?不知道,但是通常支持并使用存储过程作为数据源的工具会采用并且将使用一个(也是第一个)结果集。其他任何人都将被忽略。去他们的论坛问。

它会收到3个...吗?与第一个问题大致相同。

每个单独的查询都可以吗?? 您的过程将产生三个结果集。再次,客户如何消费它们是您应该在其论坛上提出的问题。该过程本身不会“暂停”等待客户端执行任何操作。

这是一种好的做法吗?? 我认为不是。发布完整的废话程序也不是讨论这种方法的利弊的有用工具。可以做一件有用的事吗?有可能但是,IME并不经常这样做。另外,您正在使用您不熟悉的工具。不管您使用什么工具,保持事情越简单,从长远来看就越好。

一个过程是一个工作单元,应该做一个“事情”。如果它产生多个结果集,则可以说它停止做一件事情,因为从逻辑上讲,每个结果集代表一组不同的(即使相关)事物。通常,人们期望看到结果集之间的某种关系。如果没有关系,那么结果集显然是不同的东西,这违反了过程的想法。您可能需要查看耦合和内聚的主题。但我认为我看到了一个更大的问题-下一个问题将解决。

对性能有影响吗?这真的无法回答。性能始终是特定于特定情况(查询,架构等)的。根据最后一句话,我认为您尚未调整集思考方式,这对于编写高效的sql至关重要。相反,我猜想您是在考虑包括select语句的循环方面的考虑,并且每次迭代都会产生一组(也许1,但谁知道)行。如果您认为“选项”仅产生一个3行结果集与3个1行结果集,那么您很可能陷入RBAR领域。无论如何,这实际上无法回答。对于Informatica员工来说,这也是一个问题。