如何在SSRS数据集中列出动态SQL查询中的字段

时间:2012-05-02 21:20:05

标签: sql-server tsql reporting-services ssrs-2008

我在SSRS中运行以下查询。如果我为这两个参数添加声明,它在SQL管理控制台中运行良好。

declare @EMRQuery varchar(max)
declare @CPSQuery varchar(max)

set @EMRQuery = 'select Person.ExternalId 
                    from ml.Person 
                        join ml.Obs on Person.pId = Obs.pId 
                            join ml.ObsHead on Obs.hdId = ObsHead.hdId 
                    where ObsHead.name = ''SCHOOLREGDTE'' 
                        and Obs.xId = 1.e+035
                        and Obs.change = 2 
                        and Obs.obsDate >= to_date(''' 
                            + convert(varchar(30), @DateYearStart, 120) 
                            + ''', ''YYYY-MM-DD HH24:MI:SS'')
                        and Obs.obsDate < to_date(''' 
                            + convert(varchar(30), @DateQuarterEnd, 120) 
                            + ''', ''YYYY-MM-DD HH24:MI:SS'')'

set @CPSQuery = 'select ic.ListName, count(distinct pp.patientprofileid) as PatCount
                    from PatientProfile pp
                        left join PatientInsurance pi on pp.PatientProfileId = pi.PatientProfileId
                                and pi.OrderForClaims = 1
                                and pi.Inactive <> 1
                            left join InsuranceCarriers ic on pi.InsuranceCarriersId = ic.InsuranceCarriersId
                        join OpenQuery(EMR_LIVE
                            ,  ''' + replace(@EMRQuery, '''', '''''') +
                        ''' ) Students on pp.PatientId = Students.ExternalId
                    group by ic.ListName '

exec(@CPSQuery)

但是,当我将其插入SSRS时,它不会注册有任何可用于报告的字段。我如何说服SSRS我确实有字段可以使用?感谢。

编辑:我刚刚在查询中声明了参数,并识别了字段名称。

declare @DateYearStart datetime
declare @DateQuarterEnd datetime
set @DateYearStart = '2011-07-01'
set @DateQuarterEnd = '2012-03-31'

当然,这是错误的,因为我将参数声明两次,一次作为查询参数,一次在查询中。但是,一旦我评论出上面的线条,我就再次丢失了这些字段。

5 个答案:

答案 0 :(得分:4)

有人在MSDN论坛上建议我选择一个临时表,所以我用

替换了最后的exec语句
declare @CarrierList table (Listname varchar(200), PatCount int);
insert @CarrierList exec(@CPSQuery)
select * from @CarrierList

现在似乎工作正常。

答案 1 :(得分:3)

您如何说服SSRS您有合作领域?答案:从数据集属性...字段手动将字段添加到数据集。这将使设计人员感到高兴,只要执行查询时字段存在,报表就可以工作。至少它使用OLE DB查询到DB2使用动态查询文本。

答案 2 :(得分:1)

您的查询可能有问题。 SSRS数据集几乎可以评估您放入其中的任何内容。举个例子,我刚用这两个查询进行了一些测试:

declare @a varchar(500)
declare @b varchar(500)
set @a = '(select name from sys.tables) B'
set @b = 'select B.name as name2 from '+@a
exec(@b)

我的数据集确实识别了字段名称。

我建议您检查一下您的查询。

如果它确实不起作用,您可以尝试将代码添加到SQL Server过程,该过程返回具有预定义字段名称的表。

答案 3 :(得分:1)

由于SSRS在单击刷新按钮时使用SET FMTONLY ON;执行存储过程。然后在您的存储过程中放置​​SET FMTONLY OFF;作为第一行,它将返回您的字段。

答案 4 :(得分:0)

我怀疑这是因为你的代码中有两个查询,即使只有一个要执行。因此,我建议将两个查询合并为一个查询。