Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 如何使用存储过程获取所有SSRS订阅数据?_Sql_Sql Server_Reporting Services - Fatal编程技术网

Sql 如何使用存储过程获取所有SSRS订阅数据?

Sql 如何使用存储过程获取所有SSRS订阅数据?,sql,sql-server,reporting-services,Sql,Sql Server,Reporting Services,我是ssrs新手 我想获得ssrs订阅报告的所有可能数据,这些数据可以在ResportServer数据库中找到 我发现了一些查询,但没有正确的数据。它只适用于单个报表 我需要它的数据唯一订阅列表。如果可能,最好使用存储过程 我的问题是: SELECT b.name AS JobName , e.name , e.path , d.description , a.SubscriptionID , las

我是ssrs新手

我想获得ssrs订阅报告的所有可能数据,这些数据可以在ResportServer数据库中找到

我发现了一些查询,但没有正确的数据。它只适用于单个报表

我需要它的数据唯一订阅列表。如果可能,最好使用存储过程

我的问题是:

SELECT
        b.name AS JobName
        , e.name
        , e.path
        , d.description
        , a.SubscriptionID
        , laststatus
        , eventtype
        , LastRunTime
        , date_created
        , date_modified
FROM ReportServer.dbo.ReportSchedule a
JOIN msdb.dbo.sysjobs b
        ON a.ScheduleID = b.name
JOIN ReportServer.dbo.ReportSchedule c
        ON b.name = c.ScheduleID
JOIN ReportServer.dbo.Subscriptions d
        ON c.SubscriptionID = d.SubscriptionID
JOIN ReportServer.dbo.Catalog e
        ON d.report_oid = e.itemid
WHERE e.name = 'Sales_Report'

提前谢谢。

我有一次和你现在一样的要求

请参阅下面的存储过程

CREATE PROCEDURE [dbo].[GetSubscriptionData]
AS
BEGIN
SET NOCOUNT ON;
WITH
[Sub_Parameters] AS
(
    SELECT  [SubscriptionID], [Parameters] = CONVERT(XML,a.[Parameters])
    FROM [Subscriptions] a
),
[MySubscriptions] AS
(
    SELECT DISTINCT [SubscriptionID], [ParameterName] = QUOTENAME(p.value('(Name)[1]', 'nvarchar(max)')),   [ParameterValue] = p.value('(Value)[1]', 'nvarchar(max)')
    FROM [Sub_Parameters] a
        CROSS APPLY [Parameters].nodes('/ParameterValues/ParameterValue') t(p)
),
[SubscriptionsAnalysis] AS
(
    SELECT  a.[SubscriptionID], a.[ParameterName],  [ParameterValue] =  
        (
            SELECT  STUFF((SELECT [ParameterValue] + ', ' as [text()] 
            FROM [MySubscriptions]  
            WHERE   [SubscriptionID] = a.[SubscriptionID]   AND [ParameterName] = a.[ParameterName] 
                FOR XML PATH('')    ),1, 0, '') +''
        )
    FROM [MySubscriptions] a
    GROUP BY a.[SubscriptionID],a.[ParameterName]
)

SELECT
DISTINCT (a.[SubscriptionID]),
c.[UserName] AS Owner, 
b.Name,
b.Path,
a.[Locale], 
a.[InactiveFlags], 
d.[UserName] AS Modified_by, 
a.[ModifiedDate], 
a.[Description], 
a.[LastStatus], 
a.[EventType], 
a.[LastRunTime], 
a.[DeliveryExtension],
a.[Version],
sch.StartDate,
--e.[ParameterName],
--LEFT(e.[ParameterValue],LEN(e.[ParameterValue])-1) as [ParameterValue],
SUBSTRING(b.PATH,2,LEN(b.PATH)-(CHARINDEX('/',REVERSE(b.PATH))+1)) AS ProjectName
FROM 
    [Subscriptions] a 
    INNER JOIN [Catalog] AS b ON a.[Report_OID] = b.[ItemID]
    Inner Join ReportSchedule as RS on rs.SubscriptionID = a.SubscriptionID
    INNER JOIN Schedule AS Sch ON Sch.ScheduleID = rs.ScheduleID
    LEFT OUTER JOIN [Users] AS c ON a.[OwnerID] = c.[UserID]
    LEFT OUTER JOIN [Users] AS d ON a.MODIFIEDBYID = d.Userid
    LEFT OUTER JOIN [SubscriptionsAnalysis] AS e ON a.SubscriptionID = e.SubscriptionID;
END
这是一个简化的查询,用于获取所有SSRS订阅


如果仍有任何查询,请对其进行注释。

如果需要查找sql server代理作业,请使用此更新的代码

SET NOCOUNT ON;
WITH
[Sub_Parameters] AS
(
    SELECT  [SubscriptionID], [Parameters] = CONVERT(XML,a.[Parameters])
    FROM [Subscriptions] a
),
[MySubscriptions] AS
(
    SELECT DISTINCT [SubscriptionID], [ParameterName] = QUOTENAME(p.value('(Name)[1]', 'nvarchar(max)')),   [ParameterValue] = p.value('(Value)[1]', 'nvarchar(max)')
    FROM [Sub_Parameters] a
        CROSS APPLY [Parameters].nodes('/ParameterValues/ParameterValue') t(p)
),
[SubscriptionsAnalysis] AS
(
    SELECT  a.[SubscriptionID], a.[ParameterName],  [ParameterValue] =  
        (
            SELECT  STUFF((SELECT [ParameterValue] + ', ' as [text()] 
            FROM [MySubscriptions]  
            WHERE   [SubscriptionID] = a.[SubscriptionID]   AND [ParameterName] = a.[ParameterName] 
                FOR XML PATH('')    ),1, 0, '') +''
        )
    FROM [MySubscriptions] a
    GROUP BY a.[SubscriptionID],a.[ParameterName]
)

SELECT
    DISTINCT (a.[SubscriptionID]),
    j.name  AS SQLServerAgentJob,
    c.[UserName] AS Owner, 
    b.Name,
    b.Path,
    a.[Locale], 
    a.[InactiveFlags], 
    d.[UserName] AS Modified_by, 
    a.[ModifiedDate], 
    a.[Description], 
    a.[LastStatus], 
    a.[EventType], 
    a.[LastRunTime], 
    a.[DeliveryExtension],
    a.[Version],
    sch.StartDate,
    --e.[ParameterName],
    --LEFT(e.[ParameterValue],LEN(e.[ParameterValue])-1) as [ParameterValue],
    SUBSTRING(b.PATH,2,LEN(b.PATH)-(CHARINDEX('/',REVERSE(b.PATH))+1)) AS ProjectName

FROM [Subscriptions] a 
INNER JOIN [Catalog] AS b ON a.[Report_OID] = b.[ItemID]
Inner Join ReportSchedule as RS on rs.SubscriptionID = a.SubscriptionID
INNER JOIN Schedule AS Sch ON Sch.ScheduleID = rs.ScheduleID
LEFT OUTER JOIN [Users] AS c ON a.[OwnerID] = c.[UserID]
LEFT OUTER JOIN [Users] AS d ON a.MODIFIEDBYID = d.Userid
LEFT OUTER JOIN [SubscriptionsAnalysis] AS e ON a.SubscriptionID = e.SubscriptionID
LEFT JOIN msdb.dbo.sysobjects so ON rs.ScheduleID= so.name
INNER JOIN msdb.dbo.sysjobs J ON CONVERT( NVARCHAR(128), RS.ScheduleID ) = J.name
INNER JOIN msdb.dbo.sysjobschedules JS ON J.job_id = JS.job_id

我使用以下查询获取订阅,然后查找SQL作业脚本

USE ReportServer 
GO


CREATE TABLE #tempReports(LogEntryId BIGINT, subscriptionid VARCHAR(1000),LastRunTime DATETIME,  _Description VARCHAR(1000), ReportID VARCHAR(1000), 
             LastStatus VARCHAR(1000), rowNum INT)
INSERT INTO #tempReports
SELECT *
FROM 
(
    SELECT DISTINCT E.LogEntryId, S.subscriptionid, LastRunTime,  S.Description, E.ReportID, S.LastStatus,
          ROW_NUMBER() OVER(PARTITION BY E.ReportID, S.Description ORDER BY S.LastRunTime DESC) as rowNum
    FROM [ExecutionLogStorage]  E
    INNER JOIN Subscriptions S
        ON S.Report_OID = E.ReportID 
    WHERE 1 = 1
    AND (
        S.LastStatus LIKE '%has been saved to the "\\<server>\c$\SSRS_Report_Export\20%'
        )
)T
WHERE rowNum = 1
ORDER BY ReportID, Description


CREATE TABLE #ExecutionStatements (ExecStatement VARCHAR(1000), job_name VARCHAR(1000), theReportOrder INT,
            LogEntryId BIGINT, subscriptionid VARCHAR(1000), LastRunTime DATETIME,  _Description VARCHAR(1000), 
            ReportID VARCHAR(1000),  LastStatus VARCHAR(1000))
INSERT INTO #ExecutionStatements
SELECT 'exec sp_start_job @job_name = ''' + cast(j.name as varchar(40)) + '''' AS ExecStatement,
        j.name AS job_name, 
        ROW_NUMBER () OVER(ORDER BY LogEntryId) AS theReportOrder,
        LogEntryId, subscriptionid,LastRunTime,  _Description, ReportID, 
        LastStatus
from msdb.dbo.sysjobs j 
join msdb.dbo.sysjobsteps js 
    on js.job_id = j.job_id        
join #tempReports s 
    on js.command like '%' + cast(s.subscriptionid as varchar(40)) + '%'
WHERE 1 = 1

---Execute required statements in MSDB
SELECT E.ExecStatement + '--'+ CONVERT(VARCHAR(10),E.theReportOrder), E.theReportOrder, *
FROM #ExecutionStatements E
--WHERE subscriptionid = '3AFDAC30-4F30-423F-9F72-7C04C86026AB'
ORDER BY E.theReportOrder

SELECT DISTINCT S.subscriptionid, S.Description, E.ReportID, S.LastStatus, MAX(LastRunTime)    -- 2021-04-25 18:35:00.840
FROM [ExecutionLogStorage]  E
INNER JOIN Subscriptions S
    ON S.Report_OID = E.ReportID 
WHERE S.subscriptionid = '3AFDAC30-4F30-423F-9F72-7C04C86026AB'
GROUP BY S.subscriptionid, S.Description, E.ReportID, S.LastStatus

@Bharat我试图将其作为查询运行,结果显示一条警告消息,结果集为空列表,没有项SMSG 537,16级,状态3,第3行无效的长度参数传递到左侧或子字符串函数。@JibinMathew:我现在没有订阅SSR,我可以回答您,但这需要一些时间,您需要做的是将整个查询分割成小块,并尝试删除错误部分。@Bharat如果可能,请这样做,我也会在这方面进行研究time@JibinMathew:我已经更新了我的答案,并让我知道您的具体要求是什么?此外,错误仍然相同或有任何更新?@JibinMathew:尝试将表名指定为reportserver.dbo.Subscriptions,而不是dbo.Subscriptions。其他桌子也一样。
USE ReportServer 
GO


CREATE TABLE #tempReports(LogEntryId BIGINT, subscriptionid VARCHAR(1000),LastRunTime DATETIME,  _Description VARCHAR(1000), ReportID VARCHAR(1000), 
             LastStatus VARCHAR(1000), rowNum INT)
INSERT INTO #tempReports
SELECT *
FROM 
(
    SELECT DISTINCT E.LogEntryId, S.subscriptionid, LastRunTime,  S.Description, E.ReportID, S.LastStatus,
          ROW_NUMBER() OVER(PARTITION BY E.ReportID, S.Description ORDER BY S.LastRunTime DESC) as rowNum
    FROM [ExecutionLogStorage]  E
    INNER JOIN Subscriptions S
        ON S.Report_OID = E.ReportID 
    WHERE 1 = 1
    AND (
        S.LastStatus LIKE '%has been saved to the "\\<server>\c$\SSRS_Report_Export\20%'
        )
)T
WHERE rowNum = 1
ORDER BY ReportID, Description


CREATE TABLE #ExecutionStatements (ExecStatement VARCHAR(1000), job_name VARCHAR(1000), theReportOrder INT,
            LogEntryId BIGINT, subscriptionid VARCHAR(1000), LastRunTime DATETIME,  _Description VARCHAR(1000), 
            ReportID VARCHAR(1000),  LastStatus VARCHAR(1000))
INSERT INTO #ExecutionStatements
SELECT 'exec sp_start_job @job_name = ''' + cast(j.name as varchar(40)) + '''' AS ExecStatement,
        j.name AS job_name, 
        ROW_NUMBER () OVER(ORDER BY LogEntryId) AS theReportOrder,
        LogEntryId, subscriptionid,LastRunTime,  _Description, ReportID, 
        LastStatus
from msdb.dbo.sysjobs j 
join msdb.dbo.sysjobsteps js 
    on js.job_id = j.job_id        
join #tempReports s 
    on js.command like '%' + cast(s.subscriptionid as varchar(40)) + '%'
WHERE 1 = 1

---Execute required statements in MSDB
SELECT E.ExecStatement + '--'+ CONVERT(VARCHAR(10),E.theReportOrder), E.theReportOrder, *
FROM #ExecutionStatements E
--WHERE subscriptionid = '3AFDAC30-4F30-423F-9F72-7C04C86026AB'
ORDER BY E.theReportOrder

SELECT DISTINCT S.subscriptionid, S.Description, E.ReportID, S.LastStatus, MAX(LastRunTime)    -- 2021-04-25 18:35:00.840
FROM [ExecutionLogStorage]  E
INNER JOIN Subscriptions S
    ON S.Report_OID = E.ReportID 
WHERE S.subscriptionid = '3AFDAC30-4F30-423F-9F72-7C04C86026AB'
GROUP BY S.subscriptionid, S.Description, E.ReportID, S.LastStatus