Reporting services 在报表服务器上创建有关报表的SSRS报表
我正在使用SQL Server 2014创建一份关于我们报表服务器上所有报表的SSRS报表(用于文档编制)。我在网上找到了可以帮助我做到这一点的代码 请参阅: 代码如下:Reporting services 在报表服务器上创建有关报表的SSRS报表,reporting-services,sql-server-2014,Reporting Services,Sql Server 2014,我正在使用SQL Server 2014创建一份关于我们报表服务器上所有报表的SSRS报表(用于文档编制)。我在网上找到了可以帮助我做到这一点的代码 请参阅: 代码如下: 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 #ReportFi
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
我尝试了以下建议答案中的代码,但运行后,我收到一条错误消息:
Msg 208,16级,状态0,第77行。无效的对象名称“#ReportParameters”
因此,我将--INTO#ReportParameters取消注释,让报告运行时没有错误,但它没有从订阅表中提供任何字段。我能够使用下面的代码实现这一点。这可能对你有所帮助。您使用的别名看起来需要调整。容易错过,容易修复。:) 编辑: 下面是完整的解决方案
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
我能够使用下面的代码来实现这一点。这可能对你有所帮助。您使用的别名看起来需要调整。容易错过,容易修复。:) 编辑: 下面是完整的解决方案
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
当它开始运行并开始显示记录列表时,我非常高兴。但在它运行之后,我收到一条错误消息:msg208,16级,状态0,第77行。无效的对象名称“#ReportParameters”。你能帮我解决这个问题吗?您的代码注释掉了--INTO#ReportParameters行。。。。。。。我取消了它的注释,然后让报告运行。这就是解决方案吗?我想说,如果这是可行的,那么这就是解决方案。我将
注释为#ReportParameters
,这样我至少可以测试我发布的内容。如果您在整个代码集中需要它,那么我认为您应该很好。它可以正常工作,不会给我一个错误,但我没有得到任何订阅表字段。所以,不,它真的不起作用。我真的很感谢你的帮助。我用完整的解决方案更新了答案。我刚刚对我的SSRS数据库运行了这个,它似乎运行得很好。我希望它能满足你的期望。真是太棒了!!!这确实奏效了。然而,还有一个问题。OwnerID基本上是一个ID。我希望我可以加入OwnerID=Users.UserID上的Users表,并在结果中显示Users.UserName。\uuuuuu\u但到目前为止,你帮了我很大的忙。非常感谢大家!!!当它开始运行并开始显示记录列表时,我非常高兴。但在它运行之后,我收到一条错误消息:msg208,16级,状态0,第77行。无效的对象名称“#ReportParameters”。你能帮我解决这个问题吗?您的代码注释掉了--INTO#ReportParameters行。。。。。。。我取消了它的注释,然后让报告运行。这就是解决方案吗?我想说,如果这是可行的,那么这就是解决方案。我将注释为#ReportParameters
,这样我至少可以测试我发布的内容。如果您在整个代码集中需要它,那么我认为您应该很好。它可以正常工作,不会给我一个错误,但我没有得到任何订阅表字段。所以,不,它真的不起作用。我真的很感谢你的帮助。我用完整的解决方案更新了答案。我刚刚对我的SSRS数据库运行了这个,它似乎运行得很好。我希望它能满足你的期望。真是太棒了!!!这确实奏效了。然而,还有一个问题。OwnerID基本上是一个ID。我希望我可以加入OwnerID=Users.UserID上的Users表,并在结果中显示Users.UserName。\uuuuuu\u但到目前为止,你帮了我很大的忙。非常感谢大家!!!