web-dev-qa-db-ja.com

SET FMTONLYを使用したSSRSの動的SQLストアドプロシージャのフィールドがない

私は次のSPを持っています。これは、単独で実行したときに正しく機能します。

USE [Orders]
GO
SET FMTONLY OFF; 

CREATE PROCEDURE [dbo].[Get_Details_by_Type]

@isArchived varchar(10),
@Type varchar(50)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    declare @sqlQuery nvarchar(max)
          IF(@isArchived = 'ALL')
            BEGIN
                set @sqlQuery  = 'SELECT *  FROM [dbo].[Orders] 
              WHERE ' + @Type + ' != € 
                ORDER BY [IDNumber]'
                exec sp_executesql @sqlQuery
            END
        ELSE
            BEGIN
            set @sqlQuery  = 'SELECT * FROM [dbo].[Orders] 
          WHERE ' + @Type + ' != € AND [isArchived] = ' + @isArchived + ' ORDER BY [IDNumber]'
            exec sp_executesql @sqlQuery
        END
END
SET FMTONLY ON; 

私が抱えている問題は、SSRSレポートのDataSetを追加すると、フィールドセクションにフィールド/列がプルされないことです。動的SQLが原因だと思いますか?

どうすれば解決できますか?

16
sd_dracula

問題
動的SQLおよび一時テーブルを含むストアドプロシージャは、SSRSなどのウィザードや、Linq2SQLおよびEFリバースエンジニアリングツールなどのORMジェネレーターの悩みの種です。

これは、PROCによって生成された結果セットスキーマを導出するために、PROCを実行する前にツール_SET FMTONLY ON;_(または最近では _sp_describe_first_result_set_ )が使用されるためです。これにより、ReportViewer UIのマッピングを生成できます。ただし、_FMTONLY ON_も_sp_describe_first_result_も実際にはPROCを実行しません。

例えばツールは次のようなことをします:

_SET FMTONLY ON;
EXEC dbo.MyProc NULL;
_

いくつかの回避策:

  • RDL/RDLCファイルを手動で編集して、実際の結果セットの列名とタイプを挿入します。
  • 一時的に実際のプロシージャを削除し、実際のプロシージャによって返された実際のデータ型と列名でゼロ以上の行のデータセットを返すものに置き換え、ウィザードを実行してから、実際のプロシージャを元に戻します。
  • 一時的にPROCの最初の行として_SET FMTONLY OFF;_を追加します。これにより、PROCが強制的に実行されます。完了したら元のPROCを元に戻します(ただし、ツールから渡されたnullまたはダミーのパラメーターが原因でprocが失敗する場合があります)。また、FMTONLY廃止予定です
  • プロシージャの開始時に、結果セットの実際のスキーマを返すダミーステートメントを追加し、実行されない条件分岐にラップします。

これが最後のハックの例です:

_CREATE PROCEDURE [dbo].[Get_Details_by_Type]
  @isArchived varchar(10),
  @Type varchar(50)
AS
BEGIN
   -- For FMTONLY ON tools only
   IF 1 = 2
     BEGIN
       -- These are the actual column names and types returned by the real proc
       SELECT CAST('' AS NVARCHAR(20)) AS Col1, 
              CAST(0 AS DECIMAL(5,3)) AS Col2, ...
     END;
-- Rest of the actual PROC goes here
_

_FMTONLY ON_/_sp_describe_first_result_set_は、ダミー条件によってだまされ、決して実行されなかったブランチからのスキーマを想定します。

余談ですが、正直なところ、PROCで_SELECT *_を使用しないことをお勧めします。Ordersから返される実際の列名をすべて明示的にリストしてください

最後に、_SET FMTONLY ON;_ステートメントをprocに含めないようにしてください(上記のコードから!)

_END - Proc
GO **
SET FMTONLY ON; ** This isn't part of the Proc!
_
23
StuartLC

まだこの問題が発生している場合は、ssrsと動的sqlで同様の問題のように見えるものを解決しました。

  1. SsrsがSPからフィールドを適切にマッピングするには、
  2. クエリタイプで[テキスト]オプションを選択し、
  3. SP名前と、SSMSウィンドウから呼び出すようなパラメータを入力します。sp_YourStoredProc @Parameter1....@ParameterN
  4. [フィールドを更新]ボタンをクリックします。
  5. ステートメントが実行されると、フィールドが更新され、マトリックスが入力されます。

ところで、私はSQL 2012を使用しています

お役に立てれば。

5
ChadB

以下は私が問題を克服するためにしたことです-フィールドはSSRSにリストされていません

  1. もともと私はストアドプロシージャを持っています。データセットを実行すると、データが返されます。しかし、フィールドはSSRSにリストされていません

  2. ストアドプロシージャのテキストをコピーし、Stored ProcedureではなくTextとしてデータセットを作成しました。参照 方法:データセットのフィールドを更新する

  3. エラーが発生し、私はそれらのエラーを「無視」しました。参照 Declare cursor SQL構文またはステートメントはサポートされていません。

  4. ここで、SSRSのフィールドが入力されていることを確認しました

  5. Stored Procedureを使用するようにデータセットを更新しました

上記の手順の後で、以下に示すようにデータセットを更新します。

enter image description here

1
LCJ

私は同様の問題に遭遇しました。フラグ変数を使用して頻繁にオン/オフを切り替えるデバッグ文があります。

この行は実行されていなくても、結果に影響を与えていました(@debug = 0)

--check your work
if @debug =1  select @reportStartDate  RSD ,@reportEndDate 
         , @yearStart YS, @folderStartDate  FSD, @MonthCount MC
         , @dataStart  DataStart

sp w/fmtONlyを実行して問題を発見しました

SET FMTONLY ON
exec rpt_mo_DashBoard_YTD_Total  'ajax20','12/1/2019'

SPのコードをコメント化することで問題を解決しました。はい、デバッグするときは、各returnステートメントのコメントを解除する必要があります...

0
greg

以下の所定の手順に従ってください

•   Delete DataSource. Create a new Data Source .
•   Delete DataSet. Create a new DataSet .
•   Use Query Designer. 
•   Add valid parameter when asked  .
•   One should get result for provided prarameters . 
    Donot click on refresh Field .
•   Then Report parameters and Report field will appear .
•   Now Filter criteria should work.

OR

**Add the Report field manually . It works.**

ストアドプロシージャがスキーマデータまたはメタデータを取得できない場合は、レポートフィールドを手動で指定する必要があります。

0
Bhushan Mahajan

これは非常に遅い追加ですが、SSRS /レポートデザインを初めて使用する人にとっては、Visual Studioの[レポートデータ]ペイン内のパラメーターの順序を確認してください。それらは上から下に作成されるため、上のパラメーターは下のパラメーターに依存できません。これは1つのレポートで発生した問題でしたが、受け取ったエラーメッセージにはそれが記載されていないため、解決のために何時間も尻尾を追っていました。

0

デッドスレッドを復活させるつもりはありませんが、レポートをSSRS 2005から、ストアドプロシージャがopenqueryを使用するSSRS 2016にアップグレードするときに私を狂わせていました。

空の値を持つフィールドが含まれるレポートに絞り込みました。そのため、これをストアドプロシージャの最初に追加しました。

SET CONCAT_NULL_YIELDS_NULL OFF;

つまり、すべてのフィールドをキャストする必要はありませんでした。

0
Phelzier