Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 替换2008 R2 SSRS中的参数_Sql Server_Sql Server 2008_Reporting Services_Ssrs 2008 R2 - Fatal编程技术网

Sql server 替换2008 R2 SSRS中的参数

Sql server 替换2008 R2 SSRS中的参数,sql-server,sql-server-2008,reporting-services,ssrs-2008-r2,Sql Server,Sql Server 2008,Reporting Services,Ssrs 2008 R2,我正在使用SSRS2008R2和ReportBuilder3.0。我有一个级联报告问题,我需要帮助。第一份报告运行良好。单击报告中的链接将@processID参数传递给后续报告 现在,当在SSMS中直接使用字符串而不是参数运行查询时,所需时间不到1秒。当我用参数运行SSRS时,大约需要15分钟。我读到SSRS不能很好地处理参数。我想做的是找到一种方法将参数更改为字符串,然后发送该字符串,或者如果有人知道更好的方法 以下是报表正在运行的查询: SELECT ResultDetail_Vie

我正在使用SSRS2008R2和ReportBuilder3.0。我有一个级联报告问题,我需要帮助。第一份报告运行良好。单击报告中的链接将@processID参数传递给后续报告

现在,当在SSMS中直接使用字符串而不是参数运行查询时,所需时间不到1秒。当我用参数运行SSRS时,大约需要15分钟。我读到SSRS不能很好地处理参数。我想做的是找到一种方法将参数更改为字符串,然后发送该字符串,或者如果有人知道更好的方法

以下是报表正在运行的查询:

SELECT     ResultDetail_View.processOid, ResultDetail_View.applicationId, outputItem.outputValue, ResultDetail_View.startTime, ResultDetail_View.resultStatus, 
                      ResultDetail_View.statusMessage, ResultDetail_View.endTime, ResultDetail_View.ErrRec, COUNT(Summary.Id) AS SumRec

FROM         ResultDetail_View LEFT OUTER JOIN
                      Summary ON ResultDetail_View.processOid = Summary.Id LEFT OUTER JOIN
                      outputItem ON ResultDetail_View.outputOid = outputItem.outputItemOid

GROUP BY ResultDetail_View.processOid, ResultDetail_View.applicationId, outputItem.outputValue, ResultDetail_View.startTime, ResultDetail_View.resultStatus, 
                      ResultDetail_View.statusMessage, ResultDetail_View.endTime, ResultDetail_View.ErrRec

HAVING      (ResultDetail_View.processOid = @processID)

ORDER BY ResultDetail_View.startTime

不管原始问题是什么,看起来您可以将
having
更改为
where
,而无需更改查询结果?如果是这种情况,肯定会有助于提高性能

关于参数嗅探,您是否尝试过设置本地
nvarchar
变量并在报告中以这种方式运行查询

delcare @processIDLocal nvarchar(50) = @processID;

select r.processOid
      ,r.applicationId
      ,o.outputValue
      ,r.startTime
      ,r.resultStatus
      ,r.statusMessage
      ,r.endTime
      ,r.ErrRec
      ,count(s.Id) as SumRec
from ResultDetail_View as r
    left outer join Summary as s
        on r.processOid = s.Id
    left outer join outputItem as o
        on r.outputOid = o.outputItemOid
where r.processOid = @processID
group by r.processOid
        ,r.applicationId
        ,o.outputValue
        ,r.startTime
        ,r.resultStatus
        ,r.statusMessage
        ,r.endTime
        ,r.ErrRec
order by r.startTime;

不管原始问题是什么,看起来您可以将
having
更改为
where
,而无需更改查询结果?如果是这种情况,肯定会有助于提高性能

关于参数嗅探,您是否尝试过设置本地
nvarchar
变量并在报告中以这种方式运行查询

delcare @processIDLocal nvarchar(50) = @processID;

select r.processOid
      ,r.applicationId
      ,o.outputValue
      ,r.startTime
      ,r.resultStatus
      ,r.statusMessage
      ,r.endTime
      ,r.ErrRec
      ,count(s.Id) as SumRec
from ResultDetail_View as r
    left outer join Summary as s
        on r.processOid = s.Id
    left outer join outputItem as o
        on r.outputOid = o.outputItemOid
where r.processOid = @processID
group by r.processOid
        ,r.applicationId
        ,o.outputValue
        ,r.startTime
        ,r.resultStatus
        ,r.statusMessage
        ,r.endTime
        ,r.ErrRec
order by r.startTime;

您如何在报告中运行查询?它是一个存储过程吗?如果是这样的话,这看起来很像会妨碍SQL Server选择最佳查询计划的能力。不幸的是,这些是继承的报告。它们是临时格式,而不是存储过程。我发布的代码实际上就是运行的数据集查询。我还没有发现参数嗅探。为了以防万一,我做了一次重新编译,但在SSR和SSMS中所用的时间仍然相同。您是否在sql server实例上运行了跟踪,以查看报表运行时服务器上正在执行的查询。一旦实现了这一点,如果直接在同一台服务器上的SSMS中运行它,应该会获得完全相同的性能(无论是好是坏)。这不是一个答案,但至少可以帮助您调查问题。您如何在报告中运行查询?它是一个存储过程吗?如果是这样的话,这看起来很像会妨碍SQL Server选择最佳查询计划的能力。不幸的是,这些是继承的报告。它们是临时格式,而不是存储过程。我发布的代码实际上就是运行的数据集查询。我还没有发现参数嗅探。为了以防万一,我做了一次重新编译,但在SSR和SSMS中所用的时间仍然相同。您是否在sql server实例上运行了跟踪,以查看报表运行时服务器上正在执行的查询。一旦实现了这一点,如果直接在同一台服务器上的SSMS中运行它,应该会获得完全相同的性能(无论是好是坏)。这不是一个答案,但至少应该有助于你调查这个问题。这并没有随着时间的推移而改变任何事情。这不是参数嗅探问题,因为直接在SSMS上运行的同一查询以毫秒为单位。@bwilliamson“直接在SSMS上运行的同一查询以毫秒为单位”这几乎是参数嗅探的最大指标……如果我在两个位置运行同一查询并重新编译,它是否应该为每个位置选择最佳计划?另外,如果我在报表生成器中将数据集查询更改为仅使用字符串值而不是@参数,那么它也会在一两秒钟内运行,而不是在13分钟内运行。执行计划显示了整个过程中1行和1100万行之间的差异。@bwilliamson请阅读。您实际上是在描述参数嗅探,只是没有做实际推荐的事情来缓解它,比如使用本地参数。您看到的预期行数的巨大差异是导致计划选择错误的原因。这并没有随着时间的推移而改变任何东西。这不是参数嗅探问题,因为直接在SSMS上运行的同一查询以毫秒为单位。@bwilliamson“直接在SSMS上运行的同一查询以毫秒为单位”这几乎是参数嗅探的最大指标……如果我在两个位置运行同一查询并重新编译,它是否应该为每个位置选择最佳计划?另外,如果我在报表生成器中将数据集查询更改为仅使用字符串值而不是@参数,那么它也会在一两秒钟内运行,而不是在13分钟内运行。执行计划显示了整个过程中1行和1100万行之间的差异。@bwilliamson请阅读。您实际上是在描述参数嗅探,只是没有做实际推荐的事情来缓解它,比如使用本地参数。您看到的预期行数的巨大差异是导致计划选择不佳的原因。