以下のように、複数の結果セットを返すストアドプロシージャがあります。
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
私はいつもSSRSで複数のResultセットを取得するためにSPでParameterを使用しています。 SPのIF文で区切って、SSRSのDataset setupでFIELDをHAND TYPEアウトする必要があるんだ。
奇妙に見えるけど、うまくいくんだ...。
以下はその例です。
ストアドプロシージャ(SP)には、2つのパラメータが定義されています。 役員ID データセットフラグ
OfficerID は、入力する必要のある従業員番号です(SSRS データ入力フォーム)。 DatasetFlag は、SP で実行される IF ステートメントを制御する方法です。
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".という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が少しおかしいと思いますが、今のところ、私は楽しみながら、それが提供するものではなく、私が欲しいものを得る方法を見つけようとしています...
そんな感じでやってみてください。
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