【问题标题】:How to list fields from dynamic SQL query in SSRS dataset如何从 SSRS 数据集中的动态 SQL 查询中列出字段
【发布时间】:2012-05-12 09:48:43
【问题描述】:

我正在 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'

当然,这是错误的,因为我声明了两次参数,一次作为查询参数,一次在查询中。但是,一旦我注释掉上面的行,我又丢失了这些字段。

【问题讨论】:

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


    【解决方案1】:

    MSDN 论坛上的某个人建议我选择一个临时表,所以我将最后的 exec 语句替换为

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

    它现在似乎工作正常。

    【讨论】:

      【解决方案2】:

      您如何让 SSRS 相信您有可以使用的字段?答:从数据集属性...字段手动将字段添加到数据集。这将使设计者感到高兴,只要在执行查询时字段存在,报表就可以工作。至少它对我使用带有动态查询文本的 DB2 的 OLE DB 查询有效。

      【讨论】:

        【解决方案3】:

        您的查询可能有问题。 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)
        

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

        我建议您查看您的查询。

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

        【讨论】:

        • 正如我所说,当我声明参数并为它们提供值时,查询工作正常。当我将参数从报告中传递到数据集时,它看不到这些字段。但是,当我将计算字段添加到数据集时,我可以看到它返回了正确数量的记录,尽管我无法说服它显示我想查看的字段。
        • 我现在明白了。是的,它确实不会生成字段。你尝试过存储过程的想法吗?
        • 还没有。我很可能不得不接受这个解决方案,但是这个报告是针对第三方应用程序的,我试图尽可能少地弄乱数据定义。 (当我构建的 Oracle 物化视图失控并在每次更新数据时开始自行重建时,我学到了这一课,而不是在每晚凌晨 2:00...)
        【解决方案4】:

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

        【讨论】:

        • FMTONLY 已被弃用。
        【解决方案5】:

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

        【讨论】:

        • 不可能,很遗憾——您会注意到第一个查询正在获取参数,而 OPEN_QUERY 不允许使用参数。扩展整个事物是唯一的方法。
        • @SarekOfVulcan:我明白为什么需要使用动态 SQL 而不是将参数值直接绑定到查询。但是,您应该能够在单个 SET 语句中声明整个查询(包括 OpenQuery 中的连接子查询)。 (当然,这也不一定能解决问题!)
        • 啊,我明白你的意思了。我怀疑它不会有帮助,但我会稍后尝试。
        • 没用。仍然得到正确数量的返回记录,但看不到字段。
        猜你喜欢
        • 1970-01-01
        • 2019-09-30
        • 1970-01-01
        • 2021-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多