2017-03-03 5 views
1

サブレポートとは何も関係のない多数のアイテムに対して複数の関係がある場合、複数回実行するドリルスルーサブレポートを持つレポートがあります。SSRSサブレポートは複数回実行されますが、一度だけ実行します。

メインレポートクエリ

SELECT DISTINCT 
         cat.CategoryName AS 'Category Name', sub.SubCategoryName AS 'SubCategory Name', cur.Status, cur.PastConsiderationFlag, cur.Model, cur.Version, cur.Vendor, cur.AvailableDate AS 'Available Date', cur.EndOfProduction AS 'End of Production', 
         cur.EndOfSupport AS 'End of Support', dep.DepartmentName AS 'Department Name', emp.FirstName + ' ' + emp.LastName AS 'Tech Owner', emp2.FirstName + ' ' + emp2.LastName AS 'Tech Contact', 
         cur.NumOfDevices AS '# of Devices', cur.UpgradeDuration AS 'Upgrade Duration', cur.FiscalConsideration AS 'Fiscal Consideration', cur.Description, cur.SupportingComments, cur.CurrencyId, STUFF 
          ((SELECT  ', ' + pl.PlatformName AS Expr1 
           FROM   Platform AS pl LEFT OUTER JOIN 
                  Currency_Platform AS cp ON cur.CurrencyId = cp.CurrencyId 
           WHERE  (pl.PlatformId = cp.PlatformId) FOR XML PATH('')), 1, 1, '') AS 'Platforms', ISNULL(STUFF 
          ((SELECT  ', ' + cu2.Model AS Expr1 
           FROM   Currency AS cu2 RIGHT OUTER JOIN 
                  Currency_Dependency AS cd ON cur.CurrencyId = cd.CurrencyId 
           WHERE  (cu2.CurrencyId = cd.DependencyId) FOR XML PATH('')), 1, 1, ''), 'N/A') AS 'Dependencies', ISNULL(STUFF 
          ((SELECT  ', ' + cu2.Model AS Expr1 
           FROM   Currency AS cu2 RIGHT OUTER JOIN 
                  Currency_Affected AS ca ON cur.CurrencyId = ca.CurrencyId 
           WHERE  (cu2.CurrencyId = ca.AffectedId) FOR XML PATH('')), 1, 1, ''), 'N/A') AS 'Affected Apps', Currency_Platform.PlatformId 
FROM   Currency AS cur INNER JOIN 
         SubCategory AS sub ON cur.SubCategoryId = sub.SubCategoryId INNER JOIN 
         Category AS cat ON sub.CategoryId = cat.CategoryId LEFT OUTER JOIN 
         Employee AS emp ON cur.OwnerId = emp.EmployeeId LEFT OUTER JOIN 
         Employee AS emp2 ON cur.ContactId = emp2.EmployeeId LEFT OUTER JOIN 
         Department AS dep ON cur.PortfolioOwnerId = dep.DepartmentId LEFT OUTER JOIN 
         Currency_Platform ON cur.CurrencyId = Currency_Platform.CurrencyId 

それは明確な選択だにもかかわらず、サブレポートは、それが属するプラットフォームの量に等しい実行されます。ここにサブレポートのクエリを含めます。

;with cte as (
-- anchor elements: where curr.Status = 1 and not a dependent 
    select 
     CurrencyId 
    , Model 
    , Version 
    , ParentId  = null 
    , ParentModel = convert(varchar(128),'') 
    , Root   = curr.Model 
    , [Level]  = convert(int,0) 
    , [ParentPath] = convert(varchar(512),Model + Version) 
    from dbo.Currency as curr 
    where curr.Status = 1 
    /* anchor's do not depend on any other currency */ 
    and not exists (
     select 1 
     from dbo.Currency_Dependency i 
     where curr.CurrencyId = i.DependencyId 
    ) 
    -- recursion begins here 
    union all 
    select 
     CurrencyId = c.CurrencyId 
    , Model  = c.Model 
    , Version  = c.Version 
    , ParentId  = p.CurrencyId 
    , ParentModel = convert(varchar(128),p.Model + p.Version) 
    , Root   = p.Root 
    , [Level]  = p.[Level] + 1 
    , [ParentPath] = convert(varchar(512),p.[ParentPath] + ' > ' + c.Model + ' ' + c.Version) 
    from dbo.Currency as c 
    inner join dbo.Currency_Dependency as dep 
     on c.CurrencyId = dep.DependencyId 
    inner join cte as p 
     on dep.CurrencyId = p.CurrencyId 
) 
select CurrencyId, ParentPath, Model + ' ' + Version AS 'Model' from cte 
WHERE CurrencyId = @CurrencyId 

個別にサブレポートを実行すると、すべて正常です。 CurrencyIdをパラメータとして渡すメインレポートを通じてサブレポートを開くと、そのレポートは、そのレポートが所属するプラットフォームの数だけ何度も実行されます。

これを修正するには、クエリを改善する方法がありますか、または好きなように、サブレポートを1回だけ実行するように強制しますか?

ありがとうございます。

+1

は、あなたがどのように多くの時間とパラメータ何を見るために、SQL Serverプロファイラを使用することができます返さどのように多くの値

  • を走っていているものパラメータを持ちますサブレポートクエリが実行されていますか?また、最初のクエリが返す値の数とサブレポートの実行回数は何回ですか? – jambonick

  • +0

    私はSQL Server Profilerが何であるかは分かりませんが、少し調べてみると、どの情報が得られるかがわかります。 – David

    +1

    今後の使用についてはこちらをご覧くださいhttps://www.codeproject.com/Articles/21371/SQL-Server-Profiler-Step-by-Step SQL Serverで最初のクエリを実行し、その結果を表示してください – jambonick

    答えて

    1

    SQL Server Profilerを使用すると、次のことを確認できます。

    1. 何回とサブレポートのクエリは、あなたの最初のクエリが
    +0

    もう一度教えてくれてありがとう。それは問題を非常に簡単に見つけるのに役立ちました。 – David

    1

    あなたの問題は、あなたのT-SQLコードよりもSSRSに関するものではないと思います。私は、サブレポートオブジェクトがレポートのレポート詳細セクションにあると推測して言います。つまり、メインクエリデータセットの各行に対してサブレポートが1回レンダリングされます。あなたのコンテナレポートが実際にどのように見えるか分かりませんが、ヘッダーまたはフッターセクションにサブレポートを含めて、それがMAX()、MIN()の値からすべての行について同じことが分かります。

    +0

    私はメインのクエリをもう一度見て、それを実行してレポートをフィルタリングするためのパラメータとしてそれを使用できるようにするクエリにPlatformIdが含まれていることを発見しました。 私はあなたにこれを見ていただきありがとうございます! – David

    関連する問題