私は次の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が原因だと思いますか?
どうすれば解決できますか?
問題
動的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;
_
いくつかの回避策:
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!
_
まだこの問題が発生している場合は、ssrsと動的sqlで同様の問題のように見えるものを解決しました。
sp_YourStoredProc @Parameter1....@ParameterN
ところで、私はSQL 2012を使用しています
お役に立てれば。
以下は私が問題を克服するためにしたことです-フィールドはSSRSにリストされていません
もともと私はストアドプロシージャを持っています。データセットを実行すると、データが返されます。しかし、フィールドはSSRSにリストされていません
ストアドプロシージャのテキストをコピーし、Stored Procedure
ではなくText
としてデータセットを作成しました。参照 方法:データセットのフィールドを更新する
エラーが発生し、私はそれらのエラーを「無視」しました。参照 Declare cursor SQL構文またはステートメントはサポートされていません。
ここで、SSRSのフィールドが入力されていることを確認しました
Stored Procedure
を使用するようにデータセットを更新しました
上記の手順の後で、以下に示すようにデータセットを更新します。
私は同様の問題に遭遇しました。フラグ変数を使用して頻繁にオン/オフを切り替えるデバッグ文があります。
この行は実行されていなくても、結果に影響を与えていました(@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ステートメントのコメントを解除する必要があります...
以下の所定の手順に従ってください
• 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.**
ストアドプロシージャがスキーマデータまたはメタデータを取得できない場合は、レポートフィールドを手動で指定する必要があります。
これは非常に遅い追加ですが、SSRS /レポートデザインを初めて使用する人にとっては、Visual Studioの[レポートデータ]ペイン内のパラメーターの順序を確認してください。それらは上から下に作成されるため、上のパラメーターは下のパラメーターに依存できません。これは1つのレポートで発生した問題でしたが、受け取ったエラーメッセージにはそれが記載されていないため、解決のために何時間も尻尾を追っていました。
デッドスレッドを復活させるつもりはありませんが、レポートをSSRS 2005から、ストアドプロシージャがopenqueryを使用するSSRS 2016にアップグレードするときに私を狂わせていました。
空の値を持つフィールドが含まれるレポートに絞り込みました。そのため、これをストアドプロシージャの最初に追加しました。
SET CONCAT_NULL_YIELDS_NULL OFF;
つまり、すべてのフィールドをキャストする必要はありませんでした。