注册 登录
编程论坛 SQL Server论坛

请教高手一个关于调用存储过程返回结果的问题!

binghe6610 发布于 2011-05-10 01:05, 1665 次点击
我有一个带参数的存储过程,我这个存储过程的返回值(只返回一个表)不是很理想,
所以我想在数据库中对这个存储过程的返回值在“加工”,就像是select一个数据库表一样
请教高手,有没有在视图中调用存储过程的返回值的,创建一个自定义函数来调用存储过程返回值的
尽量不考虑使用临时表,我不想占用服务器资源,

谢谢了
13 回复
#2
binghe66102011-05-10 09:57
期待高手回复
#3
qingshuiliu2011-05-10 10:10
视图和表使用起来基本一样,
你把你现在的语句贴出来,大家可以帮你看看
#4
binghe66102011-05-10 10:58
CREATE PROCEDURE shourutongji_1
@louceng varchar(20),@qiriqi as varchar(10),@zhiriqi as varchar(10)
 AS
declare @sql varchar(8000)
set @sql = 'select distinct fk_zwid as 展位编号,(select zw_name from zwzlb where zw_id=fk_zwid) as 展位名称,sum(fk_cuxiaofei) as 促销费,sum(fk_shuakafei) as 刷卡费'
select @sql = @sql + ' ,isnull((select sum(kk_bencikoukuan) from kkb where kk_zwid=fk_zwid and convert(char(10),kk_date,120)=convert(char(10),fk_date,120) and kk_xiangmu=''' + kk_xiangmu + '''),0) [ ' + kk_xiangmu + '] '
from (select distinct kk_xiangmu from kkb) as a
set @sql = @sql + ' from fkb where convert(char(10),fk_date,120)>=''' + @qiriqi + ''' and convert(char(10),fk_date,120)<=''' + @zhiriqi + '''  '
if @louceng is null
set @sql = @sql + ' group by fk_zwid,convert(char(10),fk_date,120) order by fk_zwid'
else
set @sql = @sql + '  and fk_zwid in (select zw_id from zwzlb where zw_lc=''' + @louceng + ''') group by fk_zwid,convert(char(10),fk_date,120) order by fk_zwid'
exec(@sql)
GO
#5
binghe66102011-05-10 11:03
这是我的存储过程,能正确返回一个表,只是存在两个小问题,
fk_zwid是唯一键
第一、如果FKB中在@qiriqi和@zhiriqi之间fk_zwid出现过两次,而在动态行转列的表KKB中没有数据的话,fkb中的sum(fk_cuxiaofei)和sum(fk_shuakafei)不能合并,会出现两行
第二、横向加一个合计列不知道怎么加,当然这个可以在我的程序界面完成,如果能在SQL中实现当然更好
#6
binghe66102011-05-10 11:04
其实这就是一个把一对多的两个表合并的存储过程
#7
binghe66102011-05-10 11:05
合并过程中“多”表有动态行转列
#8
binghe66102011-05-10 11:05
不知道是否能够理解
#9
qingshuiliu2011-05-10 11:25
你把表贴出来,还有两个半表想怎么合并
#10
lstk5552011-05-11 22:25
通天塔
#11
go20112011-05-13 00:33
1.如果是sqlserver2005,可以新建一个存储过程,通过表变量来调用原来存储过程的返回值。例如:
CREATE PROCEDURE usp_test AS
DECLARE @TEMPTABLE TABLE (展位编号 CHAR(10),展位名称 CHAR(10),...)
INSERT INTO @TEMPTABLE(展位编号,展位名称,...) EXEC shourutongji_1 参数1,参数2,参数3
SELECT * FROM @TEMPTABLE
GO

如果是sqlserver2000就不能用这种方法,因为sqlserver2000不支持 INSERT INTO @TEMPTABLE()EXEC 存储过程
  
2.FKB中在@qiriqi和@zhiriqi之间fk_zwid出现过两次,fkb中的sum(fk_cuxiaofei)和sum(fk_shuakafei)不能合并,会出现两行可能与分组条件有关,如果将group by fk_zwid,convert(char(10),fk_date,120) 改成 group by fk_zwid,convert(char(10) 也许能解决。

因为楼主提供的信息有限,这只是一点猜测,供参考。最好是如版主提议把表贴出来。
 
#12
go20112011-05-13 09:23
1.如果要调用存储过程返回的表,可使用表变量,将存储过程查询得到的表存入表变量,然后对表变量进行查询(与表查询基本一样)。具体实现方法视使用的sqlserver版本不同有所不同。

如果是sqlserver2005,可新建一存储过程来直接调用原有的存储过程,例如:
create procedure test as
declare @tmpTable table (展位编号 char(10),展位名称 char(10),...)
insert into @tmpTable execute shourutongji_1 参数1,参数2,参数3
select * from @tmpTable
go

由于sqlserver2000不支持insert into @tmpTable execute,所以上面方法不能用,只能对原有的数据存储进行修改,在原有数据存储使用insert @tmpTable select... 来实现将查询结果表导入表变量,然后对表变量进行查询。

2.FKB中在@qiriqi和@zhiriqi之间fk_zwid出现过两次,sum(fk_cuxiaofei)和sum(fk_shuakafei)不能合并,会出现两行,可能与分组条件有关,由于楼主提供信息有限,只是猜测,仅供参考。最好能如版主提议把表贴出来。

[ 本帖最后由 go2011 于 2011-5-13 09:25 编辑 ]
#13
go20112011-05-13 09:28
不好意思,由于上传时网络故障,以为没上传成功,因此多发了一次
#14
lxd09802011-05-16 15:53
我只知道在ORACLE 可以创建一个变量来存储.然后再通过输出函数把它输出 来的.不知道在SQL可以不.
1