2017-05-02 11 views
0

私は、レポートサーバー上にあるすべてのレポートについて、SQL Server 2014を使用してSSRSレポートを作成しています。私はそれをするのに役立つコードをオンラインで見つけました。レポートサーバーのレポートに関するSSRSレポートの作成

ご覧ください。次のようにhttp://www.sqlservercentral.com/articles/Reporting+Services+(SSRS)/152814/?utm_source=SSC&utm_medium=pubemail

コードは次のとおりです。

BEGIN TRY 
DROP TABLE #ReportList 
END TRY 
BEGIN CATCH 
END CATCH 

BEGIN TRY 
DROP TABLE #ReportParameters 
END TRY 
BEGIN CATCH 
END CATCH 

BEGIN TRY 
DROP TABLE #ReportFields 
END TRY 
BEGIN CATCH 
END CATCH 

SELECT 
Name 
,Path 
INTO #ReportList 
FROM ReportServer.dbo.Catalog 
WHERE Content IS NOT NULL 
ORDER BY Name; 

SELECT DISTINCT Name as ReportName 
,ParameterName = Paravalue.value('Name[1]', 'VARCHAR(250)') 
    ,ParameterType = Paravalue.value('Type[1]', 'VARCHAR(250)') 
    ,ISNullable = Paravalue.value('Nullable[1]', 'VARCHAR(250)') 
    ,ISAllowBlank = Paravalue.value('AllowBlank[1]', 'VARCHAR(250)') 
    ,ISMultiValue = Paravalue.value('MultiValue[1]', 'VARCHAR(250)') 
    ,ISUsedInQuery = Paravalue.value('UsedInQuery[1]', 'VARCHAR(250)') 
    ,ParameterPrompt = Paravalue.value('Prompt[1]', 'VARCHAR(250)') 
    ,DynamicPrompt = Paravalue.value('DynamicPrompt[1]', 'VARCHAR(250)') 
    ,PromptUser = Paravalue.value('PromptUser[1]', 'VARCHAR(250)') 
    ,State = Paravalue.value('State[1]', 'VARCHAR(250)') 
INTO #ReportParameters 
FROM ( 
SELECT top 1000 C.Name,CONVERT(XML,C.Parameter) AS ParameterXML 
FROM ReportServer.dbo.Catalog C 
WHERE C.Content is not null 
AND C.Type = 2 
) a 
CROSS APPLY ParameterXML.nodes('//Parameters/Parameter') p (Paravalue) 
ORDER BY ReportName,ParameterName; 

WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition', 'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd) 
SELECT DISTINCT ReportName = name 
    ,DataSetName = x.value('(@Name)[1]', 'VARCHAR(250)') 
,DataSourceName = x.value('(Query/DataSourceName)[1]','VARCHAR(250)') 
,CommandText = x.value('(Query/CommandText)[1]','VARCHAR(250)') 
,Fields = df.value('(@Name)[1]','VARCHAR(250)') 
,DataField = df.value('(DataField)[1]','VARCHAR(250)') 
,DataType = df.value('(rd:TypeName)[1]','VARCHAR(250)') 
,ConnectionString = x.value('(ConnectionProperties/ConnectString)[1]','VARCHAR(250)') 
INTO #ReportFields 
FROM (SELECT C.Name,CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content)) AS reportXML 
     FROM ReportServer.dbo.Catalog C 
    WHERE C.Content is not null 
     AND C.Type = 2 
) a 
CROSS APPLY reportXML.nodes('/Report/DataSets/DataSet') r (x) 
CROSS APPLY x.nodes('Fields/Field') f(df) 
ORDER BY name 

SELECT 
a.Name AS ReportName 
,a.Path 
,SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)) AS ReportFolder 
,'http://msl-db12/Reports/Pages/Report.aspx?ItemPath='+REPLACE(SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)),'/','%2f')+REPLACE(a.Name,' ','+') AS ReportLink 
,'User Input' AS FieldType 
,b.ParameterPrompt AS DataSetOrPromptName 
,b.ParameterName AS FieldOrParameterName 
FROM #ReportList a 
LEFT OUTER JOIN #ReportParameters b ON a.Name = b.ReportName 
WHERE b.ParameterName IS NOT NULL 
UNION 
SELECT 
a.Name AS ReportName 
,a.Path 
,SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)) AS ReportFolder 
,'http://msl-db12/Reports/Pages/Report.aspx?ItemPath='+REPLACE(SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)),'/','%2f')+REPLACE(a.Name,' ','+') AS ReportLink 
,'Data Point' AS FieldType 
,b.DataSetName AS DataSetOrPromptName 
,b.Fields AS FieldOrParameterName 
FROM #ReportList a 
LEFT OUTER JOIN #ReportFields b ON a.Name = b.ReportName 
WHERE b.Fields IS NOT NULL 
ORDER BY Name,Path,FieldType,ParameterPrompt,ParameterName 

このコードは素晴らしい仕事をし、私は私のレポートサーバー上のすべてのレポートについての素敵なレポートを得ました。

サブスクリプションテーブルに参加して各レポートのサブスクリプションの列を取得するにはどうすればよいですか?

は、私は、次のコードを追加しましたが、それはかなりの仕事をしませんでした:

:私は以下の提案の答えからコードを試みたが、それは走った後、私はエラーメッセージが表示されました

WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition', 'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd) 
SELECT 
    DISTINCT ReportName = name 
     ,DataSetName = x.value('(@Name)[1]', 'VARCHAR(250)') 
    ,DataSourceName = x.value('(Query/DataSourceName)[1]','VARCHAR(250)') 
    ,CommandText = x.value('(Query/CommandText)[1]','VARCHAR(250)') 
    ,Fields = df.value('(@Name)[1]','VARCHAR(250)') 
    ,DataField = df.value('(DataField)[1]','VARCHAR(250)') 
    ,DataType = df.value('(rd:TypeName)[1]','VARCHAR(250)') 
    ,ConnectionString = x.value('(ConnectionProperties/ConnectString)[1]','VARCHAR(250)' 
    -------------------------Added this section here. 
    ,S.[OwnerID] 
    ,S.[Description] 
    ,S.LastStatus) 
    -------------------------End of the section here.  
INTO #ReportFields 

FROM ( SELECT C.Name 
     ,CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content)) AS reportXML 
    -------------------------Added this section here. 
     ,S.[OwnerID] 
     ,S.[Description] 
     ,S.LastStatus 
    -------------------------End of the section here. 
     FROM [GEB_ReportServer].[dbo].[Catalog] C 
    -------------------------And this section here.  
      INNER JOIN [GEB_ReportServer].[dbo].[Subscriptions] S ON C.ItemID = S.Report_OID 
    ------------------------- 
     WHERE C.Content is not null 
      AND C.Type = 2 
) a 

CROSS APPLY reportXML.nodes('/Report/DataSets/DataSet') r (x) 
CROSS APPLY x.nodes('Fields/Field') f(df) 

ORDER BY name 

メッセージ208、レベル16、状態0、行77です。オブジェクト名 '#ReportParameters'が無効です。

私は - INTO #ReportParametersのコメントを外しました。エラーなしで実行するレポートを取得しましたが、サブスクリプションテーブルからフィールドを取得しませんでした。

答えて

1

私はこれを以下のコードで動作させることができました。これはあなたを助けるかもしれません。使用しているエイリアスは、調整する必要があるように見えます。見逃しやすい、簡単に修正できます。 :)

SELECT DISTINCT Name as ReportName 
,ParameterName = Paravalue.value('Name[1]', 'VARCHAR(250)') 
    ,ParameterType = Paravalue.value('Type[1]', 'VARCHAR(250)') 
    ,ISNullable = Paravalue.value('Nullable[1]', 'VARCHAR(250)') 
    ,ISAllowBlank = Paravalue.value('AllowBlank[1]', 'VARCHAR(250)') 
    ,ISMultiValue = Paravalue.value('MultiValue[1]', 'VARCHAR(250)') 
    ,ISUsedInQuery = Paravalue.value('UsedInQuery[1]', 'VARCHAR(250)') 
    ,ParameterPrompt = Paravalue.value('Prompt[1]', 'VARCHAR(250)') 
    ,DynamicPrompt = Paravalue.value('DynamicPrompt[1]', 'VARCHAR(250)') 
    ,PromptUser = Paravalue.value('PromptUser[1]', 'VARCHAR(250)') 
    ,State = Paravalue.value('State[1]', 'VARCHAR(250)') 

    ,a.[OwnerID] 
    ,a.[Description] 
    ,a.LastStatus 
-- INTO #ReportParameters 
FROM ( 
SELECT top 1000 C.Name,CONVERT(XML,C.Parameter) AS ParameterXML 
,S.[OwnerID] 
,S.[Description] 
,S.LastStatus 
FROM dbo.Catalog C 
      LEFT JOIN [dbo].[Subscriptions] S ON C.ItemID = S.Report_OID 
WHERE C.Content is not null 
AND C.Type = 2 
) a 
CROSS APPLY ParameterXML.nodes('//Parameters/Parameter') p (Paravalue) 
ORDER BY ReportName,ParameterName; 

EDIT:

SELECT 
C.Name 
,C.Path 
,S.[OwnerID] 
,S.[Description] 
,S.LastStatus 
INTO #ReportList 
FROM dbo.Catalog C LEFT JOIN [dbo].[Subscriptions] S ON C.ItemID = S.Report_OID 
WHERE Content IS NOT NULL 
ORDER BY Name; 

SELECT DISTINCT Name as ReportName 
,ParameterName = Paravalue.value('Name[1]', 'VARCHAR(250)') 
    ,ParameterType = Paravalue.value('Type[1]', 'VARCHAR(250)') 
    ,ISNullable = Paravalue.value('Nullable[1]', 'VARCHAR(250)') 
    ,ISAllowBlank = Paravalue.value('AllowBlank[1]', 'VARCHAR(250)') 
    ,ISMultiValue = Paravalue.value('MultiValue[1]', 'VARCHAR(250)') 
    ,ISUsedInQuery = Paravalue.value('UsedInQuery[1]', 'VARCHAR(250)') 
    ,ParameterPrompt = Paravalue.value('Prompt[1]', 'VARCHAR(250)') 
    ,DynamicPrompt = Paravalue.value('DynamicPrompt[1]', 'VARCHAR(250)') 
    ,PromptUser = Paravalue.value('PromptUser[1]', 'VARCHAR(250)') 
    ,State = Paravalue.value('State[1]', 'VARCHAR(250)') 
INTO #ReportParameters 
FROM ( 
SELECT top 1000 C.Name,CONVERT(XML,C.Parameter) AS ParameterXML 

FROM dbo.Catalog C 
WHERE C.Content is not null 
AND C.Type = 2 
) a 
CROSS APPLY ParameterXML.nodes('//Parameters/Parameter') p (Paravalue) 
ORDER BY ReportName,ParameterName; 

WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition', 'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd) 
SELECT DISTINCT ReportName = name 
    ,DataSetName = x.value('(@Name)[1]', 'VARCHAR(250)') 
,DataSourceName = x.value('(Query/DataSourceName)[1]','VARCHAR(250)') 
,CommandText = x.value('(Query/CommandText)[1]','VARCHAR(250)') 
,Fields = df.value('(@Name)[1]','VARCHAR(250)') 
,DataField = df.value('(DataField)[1]','VARCHAR(250)') 
,DataType = df.value('(rd:TypeName)[1]','VARCHAR(250)') 
,ConnectionString = x.value('(ConnectionProperties/ConnectString)[1]','VARCHAR(250)') 

INTO #ReportFields 
FROM (SELECT C.Name,CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content)) AS reportXML 
     FROM dbo.Catalog C 
    WHERE C.Content is not null 
     AND C.Type = 2 
) a 
CROSS APPLY reportXML.nodes('/Report/DataSets/DataSet') r (x) 
CROSS APPLY x.nodes('Fields/Field') f(df) 
ORDER BY name 

SELECT 
a.Name AS ReportName 
,a.Path 
,a.[OwnerID] 
,a.[Description] 
,a.LastStatus 
,SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)) AS ReportFolder 
,'http://msl-db12/Reports/Pages/Report.aspx?ItemPath='+REPLACE(SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)),'/','%2f')+REPLACE(a.Name,' ','+') AS ReportLink 
,'User Input' AS FieldType 
,b.ParameterPrompt AS DataSetOrPromptName 
,b.ParameterName AS FieldOrParameterName 
FROM #ReportList a 
LEFT OUTER JOIN #ReportParameters b ON a.Name = b.ReportName 
WHERE b.ParameterName IS NOT NULL 
UNION 
SELECT 
a.Name AS ReportName 
,a.Path 
,a.[OwnerID] 
,a.[Description] 
,a.LastStatus 
,SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)) AS ReportFolder 
,'http://msl-db12/Reports/Pages/Report.aspx?ItemPath='+REPLACE(SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)),'/','%2f')+REPLACE(a.Name,' ','+') AS ReportLink 
,'Data Point' AS FieldType 
,b.DataSetName AS DataSetOrPromptName 
,b.Fields AS FieldOrParameterName 
FROM #ReportList a 
LEFT OUTER JOIN #ReportFields b ON a.Name = b.ReportName 
WHERE b.Fields IS NOT NULL 
ORDER BY Name,Path,FieldType,ParameterPrompt,ParameterName 


DROP TABLE #ReportList 
DROP TABLE #ReportParameters 
DROP TABLE #ReportFields 
+0

以下

完全なソリューションこれを実行し始め、レコードのリストを表示するために始めたとき、私はとても幸せでした。しかし、それが実行された後、私はエラーメッセージを受け取った:メッセージ208、レベル16、状態0、行77.無効なオブジェクト名 '#ReportParameters'。解決してもらえますか? >>>>あなたのコードは - INTO #ReportParameters行をコメントアウトしました.......私はコメントを外し、実行するレポートを得ました。それは解決策ですか? – user1777929

+0

これが今働いているなら、それは解決策です。私は 'INTO#ReportParameters'をコメントアウトして、少なくとも私が投稿したものをテストすることができました。あなたが全体のコードセットでそれを必要とするなら、あなたは良いと思うはずです。 –

+0

私はエラーを出すことなく動作しますが、サブスクリプションテーブルのフィールドは表示されません。そう、いいえ、実際には機能しません。私は本当にあなたの助けに感謝します。 – user1777929

関連する問題