SQL Server 2005 reporting services 是否不支持存储过程的临时表?求教报表开发高人

hengdda 2008-09-20 12:08:27
说一下我的报表业务需求

我经常把大量的数据从多个表中提取出来 汇总到一个临时表里 然后最后把这个临时表的数据一起再group by返回结果

例如 我有一个零售店的数据 每天都有很多各种商品的销售数量 每日的数据存储在每日的表中 当我查询一个月的销售时候 我需要吧每天的数据先提取到一个临时表里 最后汇总给出返回结果

以往都是报表使用存储过程实现的业务 最后把返回数据提供给jsp网页等 如今想一起用sqlserver2005的报表解决

过去的存储过程大致如此

create procedure xx
@begintime datetime, --查询开始时间
@endtime datetime --查询结束时间
as
declare ...
begin
create table #mytotal -- 创建一个用于汇总数据的临时表
(
mydate datetime, -- 日期
myitem varchar(10),-- 商品名
itemcnt int -- 商品销售数量
)
...这里有个循环查找输入参数的时间范围内所有表
insert into #mytotal
select
mydate,myitem,itemcnt...from mytblxxx
...以上从每天的表里提出一些数据插入临时表 mytblxxx 可以是 mytbl20080919 mytbl20080920 等每天一张的表

select mydate,myitem,sum(itemcnt) from #mytotal group by mydate,myitem
...最后再把汇总的数据给分组返回结果
end

不复杂的存储过程

但是就这么一个存储过程我在使用sqlserver2005的报表进行创建报表的时候却没什么办法

在报表设计 设计查询窗口 查询字符串里 我仅仅输入了

exec xx @begintime,@endtime

提示我 sql_variant 不能隐形转换为 datetime 就不说了 我还可以修改存储过程的输入参数类型对付

但是 我发现 这个报表结果集自动生成 似乎是依赖于检查存储过程的返回结果来源于哪个表的
糟糕的是 我这个来源是个临时表 而且是个只有存储过程被执行才可以生成的临时表 reporting services 是无法从目前不存在的临时表里获得报表返回结果集项的。

我如果把 #mytotal 换成了 普通表自然可以解决这个问题 但是我的业务需要 同时给多个用户使用 改成普通表导致的后果是这个表同个时间被多人修改 那后果就是出错。

我想问的 是否sqlserver2005 的reporting services 就是不支持我这么使用存储过程的? 不允许最终返回结果从一个临时表出来?

但是我想我这个需求应该是个很常见的需求吧 绝大多数做报表的人应该都是使用 网页和存储过程交互的吧?

请教 我目前的这个存储过程的使用方法 如何在报表中实现?如果我要使用临时表的话 ?
当然 如果能达到同时给多人使不冲突的效果 有其他的解决方法也是可以的 多谢多谢~


...全文
533 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljjhxyljj 2009-02-20
  • 打赏
  • 举报
回复
楼主,我也是在reporting services中使用存储过程,也是在命令类型中选择storeprocedure,在查询字符串中输入“exec 存储过程名 @参数1,@参数2”,我的存储过程只返回一个值,点击刷新字段后,没有反应,而且点击运行时,出现00972错误:identifier is too long。
请问楼主,有无办法解决?谢谢!
hengdda 2008-09-26
  • 打赏
  • 举报
回复
解决了 多谢以上各位提醒了我

使用报表向导是无法使用存储过程的 直接创建报表 在数据里输入存储过程 命令类型选择storeprocedure 然后刷新 各种参数就出来了 临时表是支持的
hyqwan11112 2008-09-20
  • 打赏
  • 举报
回复
用临时表是可以的,只是reporting service的确会有错误提示,但你不管它,确定之后点击那个刷新字段按钮结果集便会把字段列出来,就可以用了!我觉得你这种情况用表变量应该也可以,当然这个我没试验过,好久没用reporting service了
hyqwan11112 2008-09-20
  • 打赏
  • 举报
回复
提示你对象名"#mytotal"无效对嘛?
cow_sheep 2008-09-20
  • 打赏
  • 举报
回复
帮顶 继续关注
dawugui 2008-09-20
  • 打赏
  • 举报
回复
不清楚.

但是动态SQL不支持表变量.

可以将你的临时表变为临时使用的表,用之前创建,用完后删除.
xiaohanxue 2008-09-20
  • 打赏
  • 举报
回复
reporting services支持临时表是肯定的。而且用法也就是在procedure中将多个表中的数据insert到临时表中。最后再select from 临时表取得数据就行了。

而且报表结果集依赖临时表也没有关系吧。只是那个结果集的名字是那样的,我们只需要将临时表中的字段拖到报表的单元格中就行了吧。应该是没影响的。这些我以前用过的。
hengdda 2008-09-20
  • 打赏
  • 举报
回复
谢谢各位的解答

to dawugui: 可以将你的临时表变为临时使用的表,用之前创建,用完后删除.
关于这个 依旧是有冲突的 因为我的用户往往容易统一在同一个时间点 比如每周一上午9点00开始检查上一周的业务 一旦一个查询超过1分钟 就有可能不同地方的两个人同时查询 如果不用临时表用普通表的话 即便是用时建立完毕删除 依旧有可能两个用户冲突的。

to hyqwan11112:
是的 提示我这个表"#mytotal"无效 因为这个临时表当时并不再数据库中真实存在。
确定之后点击那个刷新字段按钮结果集便会把字段列出来 -- 关于这个 我一般在 报表向导 - 报表查询 这一步输入查询字符串的时候已经走不下去了 这里是没有刷新字段按钮的吧?

to zhangzeshuai:
主要是走到这步 报表向导 - 报表查询 - 输入查询字符串 就走不去下了 我找不到 查询工具栏 我是develop版 难道这个没有?

to xiaohanxu
需要将临时表中的字段拖到报表的单元格中就行了
-- 怎么拖呢?我只能走到这步 根本走不到最后的 数据 -布局-预览 那个界面去啊 就说 我连报表向导都走不完 无法保存的~

to wbfsa
谢谢~~
行者无疆-Kevin 2008-09-20
  • 打赏
  • 举报
回复
Reportint Services和数据库一样.
数据库支持的写法.在这里面都支持(常用的)
以前做过,临时表,动态sql,都可以.

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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