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

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

7 ответов

Решение

Нет.

ReportBuilder будет

  1. Догадываюсь ты
  2. рассматривает @Results как параметр

Поместите все это в хранимую процедуру и вызовите эту процедуру в построителе отчетов. Если у вас есть много строк для обработки, вам может быть лучше (с точки зрения производительности) использовать таблицу #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

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

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

ОБЪЯВИТЬ @NumberOfLines INT
ОБЪЯВИТЬ @RowsToProcess INT
ОБЪЯВИТЬ @CurrentRow INT
ОБЪЯВИТЬ @CurRow INT
ОБЪЯВИТЬ @cntMax INT
ОБЪЯВИТЬ @NumberOfRecords INT
ОБЪЯВИТЬ @SelectedType char(12)
ОБЪЯВИТЬ @varTable TABLE (# int, тип char(12), ord int) 
DECLARE @table1 TABLE (тип char (12), title varchar (80), ord int) 
DECLARE @ table2 TABLE (тип char (12), title varchar (80), ord int)

INSERT INTO @varTable ВЫБЕРИТЕ count (type) как '#', type, count(type) ОТ заголовков GROUP BY type ORDER BY type ВЫБЕРИТЕ @cntMax = max(#) из @varTable

ВСТАВЬТЕ в @table1 (type, title, ord) тип SELECT, N'', 1 ОТ заголовков ВСТАВИТЬ в @table2 (тип, заголовок, ord) ВЫБРАТЬ тип, заголовок, 1 ОТ заголовков

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

SELECT @RowsToProcess = COUNT (*) из @varTable

WHILE @CurrentRow <@RowsToProcess НАЧАТЬ
SET @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

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

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

Это возможно, только объявите свою таблицу с помощью '@@'. Пример:

      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
Другие вопросы по тегам