楼主: haitao

请问SQL如何将存储过程返回的记录集接受过来继续使用?

[复制链接]
论坛徽章:
7
咸鸭蛋
日期:2012-06-11 16:11:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31喜羊羊
日期:2015-03-10 14:01:43喜羊羊
日期:2015-03-16 11:00:26
11#
 楼主| 发表于 2004-8-30 17:36 | 只看该作者

SQL语法的自定义函数可以执行一个他人或系统的存储过程,并截取这个存储过程中的select出来的所有记录集?
好像没看到这样的截取语法?

使用道具 举报

回复
论坛徽章:
117
ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322015年新春福章
日期:2015-03-04 14:19:11马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14比亚迪
日期:2013-09-18 09:31:09迷宫蛋
日期:2013-06-05 13:48:452013年新春福章
日期:2013-02-25 14:51:24
12#
发表于 2004-8-30 17:45 | 只看该作者

Re: ?

最初由 haitao 发布
[B]SQL语法的自定义函数可以执行一个他人或系统的存储过程,并截取这个存储过程中的select出来的所有记录集?
好像没看到这样的截取语法? [/B]


呵呵,再想一下,好像你说的也有道理!
老是在t-sql和pl/sql间跳来跳去,有点混了!

使用道具 举报

回复
论坛徽章:
5
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:342010新春纪念徽章
日期:2010-03-01 11:20:52ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32沸羊羊
日期:2015-06-11 20:31:50
13#
发表于 2004-8-31 01:39 | 只看该作者
use temp table

使用道具 举报

回复
论坛徽章:
7
咸鸭蛋
日期:2012-06-11 16:11:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31喜羊羊
日期:2015-03-10 14:01:43喜羊羊
日期:2015-03-16 11:00:26
14#
 楼主| 发表于 2004-8-31 08:54 | 只看该作者

存储过程是别人或系统的

已经是写成直接用select输出的了,不好改

现在想在不修改它们的前提下,执行并截取它们的输出,加以过滤/排序处理再输出

使用道具 举报

回复
论坛徽章:
117
ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322015年新春福章
日期:2015-03-04 14:19:11马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14比亚迪
日期:2013-09-18 09:31:09迷宫蛋
日期:2013-06-05 13:48:452013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2004-8-31 09:02 | 只看该作者
找到了,T-SQL还真有这种玩法!
--------------------

将存储过程重新编写为函数
本主题描述如何确定是否将现有存储过程逻辑重新编写为用户定义函数。例如,如果希望直接从查询唤醒调用存储过程,可将代码重新打包为用户定义函数。

一般来说,如果存储过程返回一个(单个)结果集,则定义表值函数。如果存储过程计算标量值,则定义标量函数。

表值函数的条件
如果存储过程满足以下条件,则可作为重新编写为表值函数的很好的候选存储过程:

逻辑可在单个 SELECT 语句中表现,但它是存储过程而不是视图,只是由于需要参数。可使用内嵌表值函数处理这种情况。


存储过程不执行更新操作(除了对表变量外)。


不需要动态 EXECUTE 语句。


存储过程返回一个结果集。


存储过程的主要目的是生成要装载到临时表的中间结果,SELECT 语句随后将查询临时表。可使用表值函数编写 INSERT...EXEC 语句。例如,请看下面的序列:
INSERT #temp EXEC sp_getresults
SELECT ...
    FROM #temp, t1
    WHERE ...

可将存储过程 sp_getresults 重新编写为表值函数,如 fn_results(),这意味着可将上面的语句重新编写为:

SELECT ...
    FROM fn_results(), t1
    WHERE ...

使用道具 举报

回复
论坛徽章:
29
生肖徽章2007版:羊
日期:2008-09-25 17:25:27马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:112013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282010广州亚运会纪念徽章:曲棍球
日期:2011-05-08 22:26:272011新春纪念徽章
日期:2011-02-18 11:42:472010广州亚运会纪念徽章:乒乓球
日期:2010-11-29 21:01:38
16#
发表于 2004-8-31 09:37 | 只看该作者

就是楼上的方法啦.

不知道你的SQL SERVER是什么版本的.但是SQL SERVER 2000的T-SQL是可以在INSERT的时候调用一个存储过程的.这样你就可以用表变量或者是临时表来存储这个记录集了.
看一下联机手册吧.

使用道具 举报

回复
论坛徽章:
7
咸鸭蛋
日期:2012-06-11 16:11:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31喜羊羊
日期:2015-03-10 14:01:43喜羊羊
日期:2015-03-16 11:00:26
17#
 楼主| 发表于 2004-8-31 10:31 | 只看该作者

谢谢先

楼上的楼上,你那是重新改写 现有的存储过程为函数了

楼上的,
如果可以 insert 临时表或表变量 exec 存储过程
那么也算走出一大步了:可以截取了
只是这样需要预先定义存储过程的输出结构,比较麻烦--但不管怎么样,总算是一劳永逸的,值得

但是我试了一下:
declare @tbaaa table (id int )
insert @tbaaa exec sp_who2
报错:
服务器: 消息 197,级别 15,状态 1,行 2
无法在向表插入变量时将 EXECUTE 用作源。


declare @tbaaa table (id int )
insert @tbaaa  sp_who2
报错:
服务器: 消息 170,级别 15,状态 1,行 2
第 2 行: 'sp_who2' 附近有语法错误。

是什么语法?我没找到帮助

使用道具 举报

回复
论坛徽章:
29
生肖徽章2007版:羊
日期:2008-09-25 17:25:27马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:112013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282010广州亚运会纪念徽章:曲棍球
日期:2011-05-08 22:26:272011新春纪念徽章
日期:2011-02-18 11:42:472010广州亚运会纪念徽章:乒乓球
日期:2010-11-29 21:01:38
18#
发表于 2004-8-31 10:45 | 只看该作者
不好意思.是我没有了解过就发言. 那可能是不能插入到表变量里,但是可以INSERT到临时表里.我刚试过了.

使用道具 举报

回复
论坛徽章:
7
咸鸭蛋
日期:2012-06-11 16:11:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31喜羊羊
日期:2015-03-10 14:01:43喜羊羊
日期:2015-03-16 11:00:26
19#
 楼主| 发表于 2004-8-31 11:21 | 只看该作者

谢谢!

临时表好像是可以插入!

那么,现在的麻烦就是 如何便捷地得到sp_who2输出的表结构定义了
因为建临时表需要完整的表结构定义
而 select * into #tmptable from atable 就好了,不用预先写定义

使用道具 举报

回复
论坛徽章:
7
咸鸭蛋
日期:2012-06-11 16:11:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31喜羊羊
日期:2015-03-10 14:01:43喜羊羊
日期:2015-03-16 11:00:26
20#
 楼主| 发表于 2004-8-31 11:49 | 只看该作者

还有一个问题

如果存储过程返回多个记录集--即它里面有多个select输出
insert tb exec sp
是不是只能截到第一个记录集?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表