I have the following SP which works correctly when ran on its own:
USE [Orders]
GO
SET FMTONLY OFF;
CREATE PROCEDURE [dbo].[Get_Details_by_Type]
@isArchiv
The Problem
Stored procs which contain Dynamic Sql and Temp tables are the bane of wizards like SSRS and ORM generators like Linq2SQL and EF reverse engineering tools.
This is because the tools SET FMTONLY ON;
(or more recently, sp_describe_first_result_set) prior to running the PROC, in order to derive the resultset schema produced by the PROC so that mappings for the ReportViewer UI can be generated. However, neither FMTONLY ON
nor sp_describe_first_result
actually execute the PROC.
e.g. the tool will do something like:
SET FMTONLY ON;
EXEC dbo.MyProc NULL;
Some Workarounds:
SET FMTONLY OFF;
as the first line in the PROC - this will force execution of the PROC. Revert the original PROC once done (although note your proc may fail because of null or dummy parameters passed in by the tool). Also, FMTONLY
is being deprecatedHere's an example of the last hack:
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
are fooled by the dummy conditional and assumes the schema from the never-executed branch.
As an aside, for your own sanity, I would suggest that you don't SELECT *
in your PROC - rather explicitly list all the real column names returned from Orders
Finally, just make sure you don't include the SET FMTONLY ON;
statement in your proc (from your code above!)
END - Proc
GO **
SET FMTONLY ON; ** This isn't part of the Proc!
Don't mean to revive a dead thread but was driving me crazy when upgrading our reports from SSRS 2005 to SSRS 2016 where Stored Procedures used openquery.
We narrowed it down to reports that had fields with empty values in. So we added this at the start of the Stored Procedure:
SET CONCAT_NULL_YIELDS_NULL OFF;
which meant we didn't need to CAST every field.
Following is what I did to overcome the issue - Fields are not listed in SSRS
Originally I have stored procedure; and it returns data when I execute the dataset. But the fields are not listed in SSRS
I copied the text of the stored procedure and made the dataset as Text
instead of Stored Procedure
. Refer How to: Refresh Fields for a Dataset
It produced errors and I "ignored" those errors. Refer The Declare cursor SQL construct or statement is not supported.
Now I verified that the fields are populated for SSRS
Now I updated the dataset to use my Stored Procedure
After the above steps, do a refresh of the dataset as shown below:
If anyone is still facing this issue, I solved what appears to be a similar problem with ssrs and dynamic sql.
sp_YourStoredProc @Parameter1....@ParameterN
BTW, I'm using SQL 2012
Hope this helps.
I ran into a similar issue. I have some debug statments that I often turn on/off w/ a flag variable.
this line was still affecting the results, even though it doesnt run (@debug =0)
--check your work
if @debug =1 select @reportStartDate RSD ,@reportEndDate
, @yearStart YS, @folderStartDate FSD, @MonthCount MC
, @dataStart DataStart
i discovered the issue by running the sp w/ fmtONly on
SET FMTONLY ON
exec rpt_mo_DashBoard_YTD_Total 'ajax20','12/1/2019'
I solved the problem by commenting out the code in the SP. Yes, now I have to uncomment /comment each return statement when its time to debug...
Follow below given steps
• 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.**
If Stored procedure can not retrieve schema data or metadata , we should manually specify the report fields.