SQL:在一个存储过程中组合多个动态结果集

时间:2008-12-29 17:37:08

标签: stored-procedures

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

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

ID名称

1 Sam

2时间

ID FName LName

1 John Jacob

2 Tim Test

3 Sam Hopkins

ID金额

1 1000

2 5000

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

我们正在使用SQL Server 2000和Java 1.4。

任何建议都将受到赞赏。

谢谢, SP

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

从国家/地区选择*; {return id,countryname,countrycode}

从人群中选择*; {ID,COUNTRYNAME,COUNTRYCODE}

从余额中选择*; {ID,COUNTRYNAME,COUNTRYCODE}

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

2 个答案:

答案 0 :(得分:1)

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

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

  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),它们的名称(别名)和数据类型必须相同...

答案 1 :(得分:0)

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