首页 > 解决方案 > 具有多项选择的存储过程 - 与客户端工具的交互?

问题描述

假设我有一个如下的存储过程:

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 表类型参数的交换,但如果我是正确的(基于其他故事)这似乎是不可能的(就像输入一样)
    • 这种方式对性能有影响吗?如果是这样,有什么方法可以尽可能高效地做到这一点(例如,只将一个结果发送回客户端)

标签: sql-serverstored-proceduresmultiple-select

解决方案


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

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

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

请问每个单独的查询...?您的过程产生三个结果集。再次,客户如何消费它们是您应该在他们的论坛中询问的问题。该过程本身不会“停止”等待客户端做任何事情。

这是好习惯吗...?在我看来不是。发布一个完整的废话程序也不是讨论这种方法的利弊的有用工具。它可以是一件有用的事情吗?可能。但它并不经常使用 IME。此外,您正在处理一个您不熟悉的工具。无论您使用何种工具,从长远来看,您保持事物越简单越好。

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

是否有性能影响...?这个真的没法回答。性能始终是特定于特定情况(查询、模式等)的。基于最后一句话,我认为您还没有对集合方面的思维进行调整——这对于编写高效的 sql 至关重要。相反,我猜您正在考虑包含一个 select 语句的循环,并且每次迭代都会产生一组(可能是 1 个,但谁知道)行。如果您认为您可以“选择”只生成一个 3 行的结果集而不是 3 个 1 行的结果集,那么您很可能会陷入RBAR 领域。无论如何,这真的无法回答。对于 Informatica 人来说,这也是一个问题。


推荐阅读