2016-12-21 19 views
1

ReportServerデータベースに対するクエリに慣れてレポートのリストを見つけることができますが、親子レポート、または子レポート。SQL Server ReportServerをクエリして親子の子レポートを見つける方法

parent report output

リンクをユーザーがクリックすると、第二子の.rdlが実行された:私は、その出力はこのようなものですSSRSレポートを持っています。

子を含むレポートのリンクを識別するために実行できるクエリが必要です。

答えて

0

非常に興味深い質問です。 ReportServerデータベースを掘り下げたことで疑いがないように、サーバー上の各オブジェクトは、ItemIDで一意に識別されるカタログテーブルの行で表されます。そして、間違いなくあなたが見つけたように、1つのカタログ項目と別のカタログ項目との間には関係がありません。したがって、レポートのドリルスルー/サブレポートを照会するための通常のSQL文を記述することはできません。

レポートでは、RDLの処理中にロードするサブレポートのみがわかります。したがって、ドリルスルー/サブレポートデータを取得するには、RDL(実際はXMLのみ)を調べる必要があります。これは、カタログ表の「コンテンツ」列に保管されます。

このSQLのビットを使用してください。

with xmlnamespaces ('http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition' as rdl), 
CatalogData as (
select ItemID, [Path], [Name], Content, convert(xml, convert(varbinary(max), Content)) 'ContentXml' 
from [Catalog] 
where [Type] = 2) 
select ItemID, [Path], [Name], ContentXml, s.value('rdl:ReportName[1]', 'nvarchar(256)') 
from CatalogData 
cross apply ContentXml.nodes('//rdl:Drillthrough') as Subreports(s); 

注意すべきいくつかのポイント:

  • 列型としてのコンテンツの二重の変換は、画像
  • reportdefintionのXML名前空間の使用です。独自のレポートサーバーから生成されたXMLを調べて、適切なものに置き換える必要があります。
  • クロス結合のxqueryはxmlルートの子孫です。これは、「ドリルスルー」タグはどこでも発生する可能性があるためです。明らかに、これは実行時間に影響を与えます。特に、サーバーに関する多くのレポートがある場合は特にそうです。したがって、パスを制限するwhere句を追加することができます。
  • サブレポートを見つけるには、クロス結合xqueryを '// rdl:Subreport'に変更します。
関連する問題