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で、新しいレポートを作成する際に、私はデータセットのためのストアドプロシージャを構成しました。これは、最初の結果セットから返されたカラムのみで、データセットを作成します。2番目の結果セットを識別しません。

どうすれば、上記のようなストアドプロシージャから両方の結果セットに対してデータセットを作成することができるのでしょうか?

ソリューション

残念ながら、ドキュメントで説明しているのはこちらの通りです。

1つのクエリで複数の結果セットを取得した場合、最初の結果セットのみが処理され、他の結果セットは無視されます。

(この質問]2を経由して見つけました)。

したがって、2つの可能性のうちの1つを使用することをお勧めします。

(1) プロシージャを2つに分割して、1つはEMPから、もう1つはDEPTからデータを返し、新しいプロシージャを2つの別々のデータセットとしてアクセスします。

(2) 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
解説 (3)

私はいつもSSRSで複数のResultセットを取得するためにSPでParameterを使用しています。 SPのIF文で区切って、SSRSのDataset setupでFIELDをHAND TYPEアウトする必要があるんだ。

奇妙に見えるけど、うまくいくんだ...。

以下はその例です。

ストアドプロシージャ(SP)には、2つのパラメータが定義されています。 役員ID データセットフラグ

OfficerID は、入力する必要のある従業員番号です(SSRS データ入力フォーム)。 DatasetFlag は、SP で実行される 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

REPORT には 2 つのデータセットがあり、1 つは私が作成したもので、パラメータと EmployeeName を取り込みます。 もう一つは私が作成したもので、SSRS は 1 つの結果セットしか使用できないため、EmployeeName を取り込みます。 しかし....私はそれをだます....

しかし、私は単純にEMPLOYENAMEをOVERTYPINGすることによってフィールドを作成し、その後、残りの部分を追加する(クエリ)。 残りの部分(クエリ)だから、データセットのPROPERTIESでFIELDSを編集して、選択列名を入れてください。

そして、PARAMETERSメニュー(Dataset Properties)から、="EmployeeName&quot.というEXPRESSIONを入力します。 を、2番目のデータセットには="Expect"を指定します。 その画面で@OfficeIDも合わせています。

これを実行すると、OfficerIDを要求されます(RSは入力フォームを作成します)。 で、そのIDを入れてVIEW REPORTを押すと。 あるいは、SSRSのフォームと同じように、ASPXページでOfficerIDを指定して、RDLをすべて作成することもできます。

BOTH DATASETSが返される(2回呼んでいるのは私の推測)。

だから、UNIONデータセットに奇抜なFILTERINGをかけたり、SSRSで処理しなければならないようなトリックをする必要がない、これは面白くない...(マジIIF?)

あるストアドプロシージャでは、20個のパラメータがあり、レポート出力にフィルタをかけることができます。 ということで、SQLレベルでレポート出力にフィルタをかけることができます。

20個のストアドプロシージャを単純に作成することはできませんが、この方法では、すべてのコードが1つの場所にあり、もちろんTEMPテーブルへのselectを使って大量のものをマージすることができます。 そして最終的には、結果セットであるテーブルを作成するだけです。

プログラマーとして、私はSSRSが少しおかしいと思いますが、今のところ、私は楽しみながら、それが提供するものではなく、私が欲しいものを得る方法を見つけようとしています...

解説 (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
解説 (0)