【问题标题】:SQL: Combine multiple dynamic resultsets in one stored procedureSQL:在一个存储过程中组合多个动态结果集
【发布时间】:2009-07-11 00:47:51
【问题描述】:

我们遇到了一个小问题,可以使用一些帮助 - 我们需要将来自一个存储过程的多个结果集组合到一个结果集中(我们的 Java 报告框架的限制)。我们已经查看了 Union 等,但问题是存储过程结果集是多个交叉表结果,并且 (1) 每个结果集的列数是未知的,(2) 每个结果集的列名是未知的。

基本上,如果 sp_ 有 3 个结果,例如:

身份证名称

1 山姆

2次

ID FName LName

1 约翰·雅各布

2 提姆测试

3 山姆·霍普金斯

身份证金额

11000

2 5000

理想的结果基本上是按原样返回我们的框架将打印给用户的上述文本。另请注意,这 3-4 个结果集彼此不相关。

我们使用的是 SQL Server 2000 和 Java 1.4。

任何建议将不胜感激。

谢谢, SP

PS:如果上面的解释不是很清楚,另一种解释。 在 SQL 查询分析器中,如果我们有 3 个选择语句:

从国家中选择 *; {返回 id,countryname,countrycode}

从人中选择*; {id,countryname,countrycode}

从余额中选择 *; {id,countryname,countrycode}

然后结果显示在三个单独的结果集框中。我们需要将这些结果集作为一个结果集由存储过程返回(但由于发生交叉表,我们不知道列的编号/名称)。 谢谢。

【问题讨论】:

    标签: stored-procedures


    【解决方案1】:

    您的问题没有指定您使用的是哪个数据库供应商或哪个客户端应用程序框架,但大多数具有存储过程的数据库都能够返回多个结果集,以及我熟悉的少数客户端框架(VB6、C++、. Net 等)都有能力从单个数据库访问中检索这些多个结果集并操纵它们来做你可能想要的任何事情......

    根据您的评论,如果您的报告框架可以硬编码以生成列标题(名字、姓氏、金额等)而无需从数据库中获取这些字符串,那么您可以这样做:

      Select ID, Name as value1, null as value2
      From TableA 
        Union
      Select ID, FName as value1, LName as value2
      From TableB 
        Union
      Select ID, Cast(Amount as VarChar(20)) as value1, null as value2
      From TableC 
    

    关键是每个select返回的列数必须相同(本例中为3),并且它们的名称(别名)和数据类型也必须相同...

    【讨论】:

    • 查尔斯,谢谢。我已经更新了带有 DB 信息等的帖子。Charles,该应用程序使用无法处理多个结果集的报告框架,即如果 sp_ 有 2-3 个选择语句,则该框架将仅显示来自第一个选择的值。不幸,但不可改变。有什么建议吗?
    【解决方案2】:

    如果不同表中的 id 是相关的,那么你的 t-SQL 应该是左连接。

    【讨论】:

      猜你喜欢
      • 2014-11-10
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多