Несколько наборов данных из хранимой процедуры в 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 при создании нового отчета я настроил хранимую процедуру для набора данных. Он создает набор данных ТОЛЬКО со столбцами, возвращенными из первого набора результатов. Он не идентифицирует второй набор результатов.

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

24
задан Thomas 16 February 2012 в 12:19
поделиться

4 ответа

К сожалению, как объясняется здесь в документации :

Если несколько наборов результатов извлекаются посредством одного запроса, обрабатывается только первый набор результатов и все остальные наборы результатов. игнорируются.

(найдено через этот вопрос .)

Поэтому я предлагаю использовать одну из двух возможностей:

(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
38
ответ дан 28 November 2019 в 23:12
поделиться

Я использую параметр в SP, чтобы постоянно получать несколько наборов результатов в SSRS. Вы должны разделить их с помощью операторов IF в SP, а затем вы должны вручную указать поля в настройках набора данных SSRS.

Кажется странным, но это работает ...

Вот пример.

Хранимая процедура (SP) имеет 2 параметра, которые определены @OfficerID @DatasetFlag

@OfficerID - это № сотрудника, который должен быть передан или ENTERED 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 ~! НО .... я обманываю это ...

Но я просто СОЗДАЮ ПОЛЯ, ПЕРЕВЕРНУВ ИМЯ РАБОТНИКА, а затем ДОБАВЬТЕ остальное (запрос). Так что отредактируйте ПОЛЯ в СВОЙСТВАХ ДАННОГО КОМПЛЕКТА и вставьте «Выбрать имена столбцов».

Затем я использую меню ПАРАМЕТРЫ (Свойства набора данных), чтобы задать ВЫРАЖЕНИЕ = "EmployeeName" для первого набора данных и = "Ожидать" для 2-го. Я также сопоставляю @OfficeID на этом экране.

затем, когда я запускаю это ... он запрашивает OfficerID (RS создает форму ввода), и когда я ввожу идентификатор и нажимаю VIEW REPORT. Или мы можем использовать все RDL с OfficerID, как это делает форма SSRS, но на странице ASPX.

Оба набора данных возвращаются (он называет это дважды, это моё предположение)

Так что НИКАКОГО ФИЛЬТРАЛЬНОГО ФИЛЬТРАЦИИ в наборе данных UNION или других трюках, с которыми мне приходится сталкиваться в SSRS, а это не весело ... (серьезно IIF?)

Я вижу одну хранимую процедуру, где у нас есть около 20 параметров, так что вы можете фильтровать ВЫХОД отчета на уровне SQL, а не извлекать монстров и фильтровать отчет.

Нет, вы не можете просто создать 20 хранимых процедур, ХОРОШО ДА, но таким образом, весь код находится в ОДНОМ месте, и, конечно, он может использовать селекторы в таблицах TEMP для объединения тонны вещей, и, в конце концов, просто ПОПУЛЯЦИЯ таблица, которая является НАБОР РЕЗУЛЬТАТОВ

Как программист, я нахожу SSRS немного странным, но пока мне весело, я пытаюсь найти способы получить то, что я хочу, а не то, что он предлагает ...

7
ответ дан 28 November 2019 в 23:12
поделиться

Попробуйте что-нибудь подобное:

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
ответ дан 28 November 2019 в 23:12
поделиться

Вот одна уловка для этого. Это следует идее «Объединить все» все результаты для одной таблицы и работает с репозиторием ssrs с таблицей

Для каждого отдельного запроса добавьте один столбец, в котором отображается назначение запроса. Например, «имя» или «адрес» эта информация повторяется для каждой строки запроса.

Тогда Союз Все разыскиваемые запросы.

В отчетах Visual studio / ssrs: Добавьте набор данных, содержащий хранимую процедуру. Затем из инструментов выберите таблицу и перетащите нужные данные в столбцы таблицы. Затем перейдите в свойства строки таблицы -> Видимость строки. поскольку здесь есть условие сортировки с функцией IFF, чтобы показывать только строки с предварительно определенным дополнительным столбцом в запросах, например, «Имя» Затем создайте второй табликс и выполните то же самое, теперь используйте функцию IIF с «Адресом», затем продолжайте как manu нужны разные таблицы.

2
ответ дан 28 November 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: