5

使用 SQL Server 2008 报告服务:

我正在尝试编写一个显示一些相关数据的报告,所以我想像这样使用@table 变量

DECLARE @Results TABLE (Number int
                       ,Name nvarchar(250)
                       ,Total1 money
                       ,Total2 money
                       )

insert into @Results(Number, Name, Total1)
select number, name, sum(total)
from table1
group by number, name

update @Results
set total2 = total
from
(select number, sum(total) from table2) s
where s.number = number

select from @results

但是,报表生成器不断要求输入变量@Results 的值。这有可能吗?

编辑:正如 KM 所建议的,我使用存储过程来解决我的直接问题,但最初的问题仍然存在:我可以在报表生成器中使用 @table 变量吗?

4

7 回答 7

6

不。

ReportBuilder 将

  1. 第二个猜你
  2. 将@Results 视为参数
于 2010-08-04T19:48:10.123 回答
3

将所有这些放在一个存储过程中,并让报告生成器调用该过程。如果您有很多行要处理,那么使用#temp 表可能会更好(性能方面),您可以在其中在 Number 上创建一个聚集的主键(或者它是 Number+Name,不确定您的示例代码)。

编辑
您可以尝试在一个 SELECT 中完成所有操作并将其发送给报告生成器,这应该是最快的(没有临时表):

select
    dt.number, dt.name, dt.total1, s.total2
    from (select
              number, name, sum(total) AS total1
              from table1
              group by number, name
         ) dt
        LEFT OUTER JOIN (select
                             number, sum(total) AS total2
                             from table2
                             GROUP BY number --<<OP code didn't have this, but is it needed??
                        ) s ON dt.number=s.number
于 2010-04-23T15:07:54.463 回答
2

我也看到了这个问题。似乎 SQLRS 有点区分大小写。如果您确保您的表变量在任何地方都以相同的字母大小写声明和引用,您将清除参数提示。

于 2013-11-25T20:12:05.337 回答
1

您可以在 SSRS 数据集查询中使用表变量,就像在我的代码中添加所需的“空”记录以将组页脚保持在固定位置(示例使用 pubs 数据库):

声明 @NumberOfLines INT
声明 @RowsToProcess INT
声明 @CurrentRow INT
声明@CurRow INT
声明 @cntMax INT
声明 @NumberOfRecords INT
声明@SelectedType char(12)
DECLARE @varTable TABLE (# int, type char(12), ord int)
DECLARE @table1 TABLE (type char(12), title varchar(80), ord int ) 
DECLARE @table2 TABLE (type char(12), title varchar(80), ord int )

插入@varTable SELECT count(type) as '#', type, count(type) FROM Titles GROUP BY type ORDER BY type 从@varTable 中选择@cntMax = max(#)

INSERT into @table1 (type, title, ord) SELECT type, N'', 1 FROM title INSERT into @table2 (type, title, ord) SELECT type, title, 1 FROM title

设置@CurrentRow = 0 SET @SelectedType = N'' SET @NumberOfLines = @RowsPerPage

从@varTable 中选择@RowsToProcess = COUNT(*)

而@CurrentRow < @RowsToProcess 开始设置@CurrentRow
= @CurrentRow + 1

SELECT TOP 1 @NumberOfRecords = ord, @SelectedType = type FROM @varTable WHERE type > @SelectedType SET @CurRow = 0 WHILE @CurRow < (@NumberOfLines - @NumberOfRecords % @NumberOfLines) % @NumberOfLines BEGIN SET @CurRow = @CurRow + 1 INSERT into @table2 (type, title, ord) SELECT type, '' , 2 FROM @varTable WHERE type = @SelectedType END END SELECT type, title FROM @table2 ORDER BY type ASC, ord ASC, title ASC
于 2011-07-06T05:24:28.893 回答
0

为什么不能将两个结果集联合起来?

于 2010-08-04T13:38:13.973 回答
0

使用表值函数而不是存储过程怎么样?

于 2010-08-04T23:01:33.333 回答
0

有可能,只用'@@'声明你的表。例子:

DECLARE @@results TABLE (Number int
                       ,Name nvarchar(250)
                       ,Total1 money
                       ,Total2 money
                       )

insert into @@results (Number, Name, Total1)
select number, name, sum(total)
from table1
group by number, name

update @@results
set total2 = total
from
(select number, sum(total) from table2) s
where s.number = number

select * from @@results
于 2022-02-09T14:03:29.223 回答