Могу ли я использовать переменную @table в построителе отчетов SQL Server? - PullRequest
4 голосов
/ 23 апреля 2010

Использование служб отчетов 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 в построителе отчетов?

Ответы [ 6 ]

5 голосов
/ 04 августа 2010

номер

ReportBuilder будет

  1. 2-я догадываюсь, что ты
  2. обрабатывает @Results как параметр
2 голосов
/ 23 апреля 2010

Поместите все это в хранимую процедуру и вызовите эту процедуру в построителе отчетов. Если у вас есть много строк для обработки, вам может быть лучше (с точки зрения производительности) использовать таблицу #temp, в которой вы создаете кластерный первичный ключ для Number (или это будет Number + Name, не уверенный в вашем примере кода).

EDIT
Вы можете попытаться сделать все в одном 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
1 голос
/ 26 ноября 2013

Я тоже видел эту проблему. Кажется, SQLRS немного чувствителен к регистру. Если вы убедитесь, что ваша табличная переменная объявлена ​​и на нее ссылаются везде с одинаковым регистром букв, вы очистите запрос параметра.

1 голос
/ 06 июля 2011

Вы можете использовать табличные переменные в запросе набора данных SSRS, как в моем коде, где я добавляю необходимые «пустые» записи для хранения нижнего колонтитула группы в фиксированном положении (пример использования базы данных pubs):

DECLARE @NumberOfLines INT
DECLARE @RowsToProcess INT
DECLARE @CurrentRow INT
DECLARE @CurRow INT
DECLARE @cntMax INT
DECLARE @NumberOfRecords INT
DECLARE @SelectedType char(12)
DECLARE @varTable TABLE (# int, type char(12), ord int) 
DECLARE @table1 TABLE (type char(12), title varchar(80), ord int )<br>
DECLARE @table2 TABLE (type char(12), title varchar(80), ord int )  </p>

<p>INSERT INTO @varTable
SELECT count(type) as '#', type, count(type) FROM titles GROUP BY type ORDER BY type
SELECT @cntMax = max(#) from @varTable</p>

<p>INSERT into @table1 (type, title, ord) SELECT type, N'', 1 FROM titles
INSERT into @table2 (type, title, ord) SELECT type, title, 1 FROM titles </p>

<p>SET @CurrentRow = 0
SET @SelectedType = N''
SET @NumberOfLines = @RowsPerPage</p>

<p>SELECT @RowsToProcess = COUNT(*) from @varTable </p>

<p>WHILE @CurrentRow < @RowsToProcess
BEGIN<br>
    SET @CurrentRow = @CurrentRow + 1</p>

<code>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
</code>
0 голосов
/ 05 августа 2010

Как насчет использования табличной функции, а не хранимой процедуры?

0 голосов
/ 04 августа 2010

Почему вы не можете просто объединить два набора результатов?

...