У меня есть хранимая процедура, которая возвращает несколько наборов результатов, как показано ниже
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) Разделить процедуру на две отдельные процедуры - одна, которая возвращает данные из 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
Я использую параметр в SP, чтобы постоянно получать несколько наборов результатов в SSRS. Вы должны разделить их с помощью операторов IF в SP, а затем вы должны вручную указать поля в настройках набора данных SSRS.
Кажется странным, но это работает ...
Вот пример.
Хранимая процедура (SP) имеет 2 параметра, которые определены @OfficerID @DatasetFlag
@OfficerID - это № сотрудника, который должен быть передан или ENTERED IN (форма ввода данных SSRS) DatasetFlag - это способ, которым я управляю какой оператор IF выполняется в 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 ~! НО .... я обманываю это ...
Но я просто СОЗДАЮ ПОЛЯ, ПЕРЕВЕРНУВ ИМЯ РАБОТНИКА, а затем ДОБАВЬТЕ остальное (запрос). Так что отредактируйте ПОЛЯ в СВОЙСТВАХ ДАННОГО КОМПЛЕКТА и вставьте «Выбрать имена столбцов».
Затем я использую меню ПАРАМЕТРЫ (Свойства набора данных), чтобы задать ВЫРАЖЕНИЕ = "EmployeeName" для первого набора данных и = "Ожидать" для 2-го. Я также сопоставляю @OfficeID на этом экране.
затем, когда я запускаю это ... он запрашивает OfficerID (RS создает форму ввода), и когда я ввожу идентификатор и нажимаю VIEW REPORT. Или мы можем использовать все RDL с OfficerID, как это делает форма SSRS, но на странице ASPX.
Оба набора данных возвращаются (он называет это дважды, это моё предположение)
Так что НИКАКОГО ФИЛЬТРАЛЬНОГО ФИЛЬТРАЦИИ в наборе данных UNION или других трюках, с которыми мне приходится сталкиваться в SSRS, а это не весело ... (серьезно IIF?)
Я вижу одну хранимую процедуру, где у нас есть около 20 параметров, так что вы можете фильтровать ВЫХОД отчета на уровне SQL, а не извлекать монстров и фильтровать отчет.
Нет, вы не можете просто создать 20 хранимых процедур, ХОРОШО ДА, но таким образом, весь код находится в ОДНОМ месте, и, конечно, он может использовать селекторы в таблицах TEMP для объединения тонны вещей, и, в конце концов, просто ПОПУЛЯЦИЯ таблица, которая является НАБОР РЕЗУЛЬТАТОВ
Как программист, я нахожу SSRS немного странным, но пока мне весело, я пытаюсь найти способы получить то, что я хочу, а не то, что он предлагает ...
Попробуйте что-нибудь подобное:
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
Вот одна уловка для этого. Это следует идее «Объединить все» все результаты для одной таблицы и работает с репозиторием ssrs с таблицей
Для каждого отдельного запроса добавьте один столбец, в котором отображается назначение запроса. Например, «имя» или «адрес» эта информация повторяется для каждой строки запроса.
Тогда Союз Все разыскиваемые запросы.
В отчетах Visual studio / ssrs: Добавьте набор данных, содержащий хранимую процедуру. Затем из инструментов выберите таблицу и перетащите нужные данные в столбцы таблицы. Затем перейдите в свойства строки таблицы -> Видимость строки. поскольку здесь есть условие сортировки с функцией IFF, чтобы показывать только строки с предварительно определенным дополнительным столбцом в запросах, например, «Имя» Затем создайте второй табликс и выполните то же самое, теперь используйте функцию IIF с «Адресом», затем продолжайте как manu нужны разные таблицы.