Могу ли я использовать переменную @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 будет
- Догадываюсь ты
- рассматривает @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 + 1SELECT 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