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

Sql server 如何在SSRS数据集中列出动态SQL查询中的字段,sql-server,tsql,reporting-services,ssrs-2008,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

我正在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数据集几乎可以评估您输入其中的任何内容。例如,我刚刚对以下两个查询运行了一个小测试:

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)
我的数据集确实能识别字段名2

我建议你重新考虑一下你的问题


如果它真的不起作用,您可以尝试将代码添加到SQL Server过程中,该过程返回一个带有预定义字段名的表

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

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

declare @CarrierList table (Listname varchar(200), PatCount int);
insert @CarrierList exec(@CPSQuery)
select * from @CarrierList

现在它似乎工作正常。

因为SSRS在SET FMTONLY打开的情况下执行存储过程;单击“刷新”按钮时。然后,将一套模糊不清地关上;作为存储过程中的第一行,它将返回您的字段。

您如何说服SSR您有字段可以使用?答:从数据集属性…字段手动将字段添加到数据集。这将使设计者感到高兴,并且只要在执行查询时字段存在,报表就会工作。至少对我来说,使用带有动态查询文本的OLEDB查询DB2是可行的。

正如我所说,当我声明参数并为它们提供值时,查询工作得很好。当我将参数从报表传递到数据集时,它不会看到字段。但是,当我将计算字段添加到数据集中时,我可以看到它返回了正确数量的记录,尽管我无法说服它显示我想要查看的字段。我现在看到了。是的,它确实不会生成字段。你尝试过存储过程的想法吗?还没有。为了解决这个问题,我可能不得不这么做,但这份报告是针对第三方应用程序的,我尽量不去干扰数据定义。从我构建的Oracle物化视图失控并开始在每次数据更新时(而不是每天凌晨2:00)重建自身时学到了这一课…不幸的是,这不可能-您会注意到第一个查询正在获取参数,而OPEN_query不允许参数。扩展整个过程是唯一的方法。@SarekOfVulcan:我明白为什么需要使用动态SQL,而不是将参数值直接绑定到查询。但是,您应该能够在单个SET语句中声明整个查询,包括OpenQuery中的联接子查询。当然,这可能无法解决问题!啊,我明白你的意思。我想这不会有什么帮助,但我以后会试试。没用。仍然返回正确数量的记录,但无法查看字段。FMTONLY已被弃用。
declare @CarrierList table (Listname varchar(200), PatCount int);
insert @CarrierList exec(@CPSQuery)
select * from @CarrierList