Множество наборов данных из хранимой процедуры в SSRS
У меня есть хранимая процедура, которая возвращает несколько наборов результатов так же, как показано ниже
Create StoredProcedure sp_MultipleDataSets
as
begin
SELECT EMPID, ENAME, JOB, SAL, DEPTID FROM EMP -- first result set
SELECT DEPTID, DNAME, LOC FROM DEPT --second result set
end
В BIDS при создании нового отчета я настроил хранимую процедуру для набора данных. Он создает набор данных ТОЛЬКО с столбцами, возвращаемыми из первого набора результатов. Он не идентифицирует второй набор результатов.
Как создать набор данных для обоих наборов результатов из хранимой процедуры, описанной выше
Ответы
Ответ 1
К сожалению, поскольку описание объясняется здесь:
Если несколько результирующих наборов извлекаются по одному запросу, обрабатывается только первый набор результатов, а все остальные результирующие элементы игнорируются.
(Найдено через этот вопрос.)
Поэтому я предлагаю использовать одну из двух возможностей:
(1) Разделите процедуру на две отдельные процедуры: одну, которая возвращает данные из EMP и одну из DEPT, и получите доступ к новым процедурам в виде двух отдельных наборов данных.
(2) Объедините два отдельных запроса (с дополнительным столбцом, чтобы указать, какой запрос создавал каждую строку) и фильтруйте или условно форматируйте отчет соответствующим образом. Объединенный запрос может выглядеть примерно так:
SELECT EMPID ID, ENAME NAME, JOB JOB_LOC, SAL, DEPTID, 'EMP' SOURCE
FROM EMP
UNION ALL
SELECT DEPTID ID, DNAME NAME, LOC JOB_LOC, NULL SAL, DEPTID DEPTID, 'DEPT' SOURCE
FROM DEPT
Ответ 2
Попробуйте что-то вроде этого:
Create StoredProcedure sp_MultipleDataSets(@Param nvarchar(10))
as
begin
if(@Param == "first")
begin
SELECT EMPID, ENAME, JOB, SAL, DEPTID FROM EMP -- first result set
end
if(@Param == "second")
begin
SELECT DEPTID, DNAME, LOC FROM DEPT --second result set
end
end
Ответ 3
Я использую параметр в SP, чтобы вытягивать множество наборов результатов в SSRS все время.
Вы должны разделить их с помощью инструкций IF в SP, а затем вы должны использовать HAND TYPE из FIELDS в настройке набора SSRS.
Кажется, что это удачный, но он работает...
Вот пример.
Сохраненная процедура (SP) имеет 2 параметра, определенные @OfficerID @DatasetFlag
@OfficerID - это Employee #, который должен быть passeed или INED IN IN (форма ввода данных SSRS)
DatasetFlag - это способ, которым я управляю, какой оператор IF выполняется в SP.
, так что вот SP:
CREATE PROCEDURE [dbo].[StoredProcedureNameHere]
@OfficerID VARCHAR(7),
@DatasetFlag VARCHAR(60)
WITH RECOMPILE
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON;
BEGIN TRY
IF @DatasetFlag = 'EmployeeName'
Begin
SELECT [EmployeeName]
FROM [DatabaseName].[scema].[Employee]
where EmployeeBNumber = @OfficerID
END
ELSE
IF @DatasetFlag = 'Expect'
Begin
SELECT
[TerritoryName]
,[TestNumber]
,[RuleNumber]
,[Expectation]
,[TestCount]
,[PercentToGoal]
FROM [Database].[scema].[Table2]
WHERE OfficerID = @OfficerID
ORDER BY TerritoryID
,TestNumber
,RuleNumber
END
RETURN
GO
В ОТЧЕТЕ есть 2 набора данных, один из которых я создаю, и он будет вызывать параметры и EmployeeName
другой, который я создаю, и он тянет в EmployeeName, поскольку SSRS может использовать только 1 результат SET ~!
НО... Я обманываю это....
но я просто делаю CREATE FIELDS, ПЕРЕДАЮ EMPLOYENAME, а затем ADD
rest (Query) Поэтому отредактируйте FIELDS в свойствах DATASET и введите имена выбранных столбцов.
Затем в меню ПАРАМЕТРЫ (Свойства набора данных) добавьте EXPRESSION = "EmployeeName"
для первого набора данных и = "Ожидать" для второго. Я также сопоставляю @OfficeID на этом экране.
тогда, когда я запускаю это... он запрашивает OfficerID (RS создает входную форму)
и когда я ввел идентификатор и нажмите VIEW REPORT. Или мы можем все RDL с OfficerID, как и форма SSRS, но на странице ASPX.
Возвращаются данные BOTH DATASETS (он называет это дважды моим предположением)
Так что НИКАКИЕ БЫСТРОЕ ФИЛЬТРЫ на наборе данных UNION или других трюках, с которыми мне приходится иметь дело в SSRS, что не весело... (серьезно IIF?)
У меня есть одна хранимая процедура, где у нас есть 20 параметров, поэтому вы можете фильтровать
OUTPUT отчета на уровне SQL, а не вытягивание и фильтрация монстра в отчете.
Нет, вы можете просто создать 20 хранимых процедур, хорошо, но таким образом, весь код находится в ОДНОМ месте, и, конечно, он может использовать selects в TEMP Tables, чтобы объединить тонны вещей,
и в итоге просто ПОПУЛЯЕТ таблицу, которая является РЕЗУЛЬТАТОМ РЕЗУЛЬТАТОВ.
Как программист, я нахожу SSRS немного странным, но до сих пор мне весело, пытаясь найти способы получить то, что я хочу, а не то, что он предлагает...
Ответ 4
Для этой цели это трюк. Это следует за идеей "Объединить все" все результаты для одной таблицы и работает с репозицией ssrs с таблицей
Для каждого отдельного запроса добавьте один столбец, где показана цель запроса. Например, например, "имя" или "адрес", эта информация повторяется для каждой строки запроса.
Then Union Все нужные запросы.
В отчетах Visual studio/ssrs: добавьте набор данных, который содержит хранимую процедуру. Затем из инструментов выберите tablix и перетащите нужные данные в столбцы tablix. Затем перейдите в свойства строки tablix → Видимость строк. потому что предложение сортировки с функцией IFF показывает только строки с ранее определенным дополнительным столбцом в запросах, например, "Имя",
Затем сделайте второй tablix и следуйте тому же, теперь используйте функцию IIF с "Address", затем продолжайте использовать различные таблицы.