存储过程返回结果集怎么union?

HappyWin 2005-11-28 09:33:43
各位前辈,小弟有一存储过程proc_st,在存储过程最后是一个select语句返回结果集。
如: exec proc_st @date1,@date2 就会返回一个结果集,先想将不同参数执行返回的结果集合并成一个,类似于union,该怎么做?
我用union好像语法都过不去啊。

多谢!!
...全文
509 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinwun 2005-11-29
  • 打赏
  • 举报
回复
use northwind

CREATE PROCEDURE Test
As
select top 10 Customerid,contactname from customers
GO

Alter PROCEDURE Test2
As
IF OBJECT_ID('tempdb..#tem1') IS NOT NULL
Drop table #tem1
Create table #tem1([Id] varchar(100),[name] varchar(100))
insert into #tem1 exec test
IF OBJECT_ID('tempdb..#tem2') IS NOT NULL
Drop table #tem2
Create table #tem2 ([Id] varchar(100),[name] varchar(100))
insert into #tem2 exec test
select * from #tem1
union all
select * from #tem2
GO

exec test2

是不是这样意思?
HappyWin 2005-11-28
  • 打赏
  • 举报
回复
lsqkeke兄弟的方法是不是要确定表结构啊?但我的表结构在运行存储过程以前是不确定的,运行第一次后才知道是什么样子。
HappyWin 2005-11-28
  • 打赏
  • 举报
回复
lsp69(浪子神剑) 跟 yinwun(小哲) 兄弟没明白我的意思,union all我是会用的,但不知道怎么将一个存储过程多次执行返回的结果集给union all在一起。谢谢了。
yinwun 2005-11-28
  • 打赏
  • 举报
回复
关键是字段要一样就没问题了。
浩方软件HFWMS 2005-11-28
  • 打赏
  • 举报
回复
select * from t1
union all
select * from t2
/* 前提:两表结构相同*/
lsqkeke 2005-11-28
  • 打赏
  • 举报
回复
存储过程proc_st返回结果集,你加个 output参数
如:
create proc proc_st
@Time1 DateTime ,
@DateRow Table() output --返回的表
在存储过程中写 select ....into @DateRow from.... 语句

然后在对每次调用存储过程所得的结果集 union
HappyWin 2005-11-28
  • 打赏
  • 举报
回复
怎么没人回啊?小弟很着急用,谢谢了
HappyWin 2005-11-28
  • 打赏
  • 举报
回复
怎么嵌套啊?兄弟能否说的详细些?
问题是我不一定要调用多少次啊?就是说我的时间参数是不定的,每次调用构造结果集都不一定要union多少次。谢谢
lovcal 2005-11-28
  • 打赏
  • 举报
回复
储存过程嵌套……
chinahfl 2005-11-28
  • 打赏
  • 举报
回复
将结果集放入临时表,再用临时表UNION all
na.nashi 2005-11-28
  • 打赏
  • 举报
回复
你的存储过程最后的select语句,应该能确定结果集的字段吧:)
na.nashi 2005-11-28
  • 打赏
  • 举报
回复
alter proc
proc_st @date1,@date2
--以下是你原来的语句
create table #tmp
{
--按结果集的结构建表
}

insert into #tmp
select
--你最后返回结果集的语句(你的存储过程最后的select语句,应该能确定结果集的字段吧:) )

(就会返回一个结果集,先想将不同参数执行返回的结果集合并成一个,类似于union,)
考虑到你的存储过程参数是日期,每次查询的结果应该是不同记录。所以直接多次运行exec proc_st @date1,@date2 就可以将数据插入到#tmp表中。最后#tmp标的结果就是你要的。再进行下一步的处理。
talantlee 2005-11-28
  • 打赏
  • 举报
回复
talantlee(Returner)兄弟,你是说被调用的存储过程中创建的临时表在外面也可以用吗?
我沒這麼說...這是肯定不行的。
假如你的SP_2返回的記錄集合是 select a,b from table1

參照
那你在SP_1創建一個臨時表
create talbe #tmp(A varchar(100),B varchar(200))
insert into #tmp(A,B) exec sp2 @a,@b
select C,d from talbe2
union
select * from #tmp
todouwang 2005-11-28
  • 打赏
  • 举报
回复
上面的方法可以的,
先把sp的结果存到表中,然后对表union
HappyWin 2005-11-28
  • 打赏
  • 举报
回复
各位前辈帮忙啊,小弟很着急,在线等ing
HappyWin 2005-11-28
  • 打赏
  • 举报
回复
talantlee(Returner)兄弟,你是说被调用的存储过程中创建的临时表在外面也可以用吗?我的不行啊,在select完后就drop了。必须drop掉的。
HappyWin 2005-11-28
  • 打赏
  • 举报
回复
talantlee(Returner)兄弟的方法1我不能用,因为被调用的存储过程已经不能改了,方法2运行的时候报错:
因为我的proc_st 中也用了一些create table #t1,insert,update语句等,最后才是一个
select * from #t1,
drop table #t1。


insert into #tmp
EXECUTE proc_st @date1,@date2

按这个方法报错:
Server: Msg 8164, Level 16, State 1, Procedure smpp_morept, Line 42
An INSERT EXEC statement cannot be nested.
talantlee 2005-11-28
  • 打赏
  • 举报
回复
lsqkeke兄弟的方法是不是要确定表结构啊?但我的表结构在运行存储过程以前是不确定的,运行第一次后才知道是什么样子。
你可以這樣
假如存儲過程1 sp_1 返回記錄集合為 select a,b from result

你可以這樣創建臨時表
select a,b into #ttt from result where 1<>1
然後執行
insert #ttt exec sp_2
然後你再用union
talantlee 2005-11-28
  • 打赏
  • 举报
回复
我知道有2種方法:
1>將其中一個存儲過程改寫成函數(因為函數可以返回一個記錄集合,可以當成表一樣使用)

2>在存儲過程中定義一個臨時表,表結構必須和另外一個存儲過程返回的記錄集合一樣
然後插入數據
insert into #temp exec sp_mytest
然後再聯合.

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧