Original Message:
Sent: Tue September 03, 2024 05:42 PM
From: Lyn
Subject: Create a report from the content store db providing details of schedules
Hi @brenda grossnickle , I'm getting below errors. Do you have update SQL, please? Appreciate it.
Msg 537, Level 16, State 6, Line 2
Invalid length parameter passed to the LEFT or SUBSTRING function.
LA
------------------------------
Lyn
Original Message:
Sent: Tue August 27, 2024 04:43 PM
From: brenda grossnickle
Subject: Create a report from the content store db providing details of schedules
I took @Thomas van der Meer Oracle SQL above and converted it to MS SQL.
Made a couple minor changes and added support for
++ job schedule steps that use the job default email address
++ added email subject
++ added external file name


-- xmlnamespaces is required for Email_Address CTE. It must be first CTE
;WITH xmlnamespaces( 'a' as xsi, 'b' as [SOAP-ENC] ) -- required for Email_Address CTE
-- select cmid, email addresses in delivoptions. uses xmlnamespaces
, Email_Address as (
select cmid, item.value('.', 'nvarchar(max)') as addresses
from CMOBJPROPS26
cross apply (values (cast(N'<xml xmlns:xsi="a" xmlns:SOAP-ENC="b">' + cast(delivoptions as nvarchar(max)) + N'</xml>' as xml))) t1(x)
cross apply t1.x.nodes('//item[@xsi:type="bus:addressSMTP"]') as t2(item)
)
-- recursive select to find all text between 'subject;deliveryOptionEnum;' and next '</value>'
-- subject;deliveryOptionEnum;deliveryOptionString;73;<value xsi:type="xsd:string">Schedule Test DV02 Version 11.0.13</value> -- example data
-- cte would pull out 'deliveryOptionString;73;<value xsi:type="xsd:string">Schedule Test DV02 Version 11.0.13'
, email_subject as -- recursive select to find all 'subject;deliveryOptionEnum;'
(
select cmid, delivoptions, 0 as st, len('subject;deliveryOptionEnum;') as ln, 0 as en, cast(null as varchar(max)) as email_subject
from CMOBJPROPS26
union all
select cmid, delivoptions, t1.st, ln, t2.en, cast(t3.n as varchar(max))
from email_subject
cross apply (values (charindex('subject;deliveryOptionEnum;', delivoptions, email_subject.st + 1) ) ) t1(st)
cross apply (values (charindex('</value>', delivoptions, t1.st)) ) t2(en)
cross apply (values (case when t1.st > 0 then substring(delivoptions, t1.st + ln, t2.en - (t1.st + ln)) end) ) t3(n)
where t1.st > 0
)
-- calls email_subject and takes returned text 'deliveryOptionString;73;<value xsi:type="xsd:string">Schedule Test DV02 Version 11.0.13' and pulls off 'Schedule Test DV02 Version 11.0.13'
, email_subject_select as
(
select cmid, ltrim(rtrim(reverse(left(reverse(email_subject), charindex('>',reverse(email_subject)) - 1)))) email_subject
from email_subject
where st > 0
)
-- recursive select to find all text between 'filenameStub;archiveOptionEnum;;' and next '</value>'
-- filenameStub;archiveOptionEnum;archiveOptionString;68;<value xsi:type="xsd:string">Officer Product Group Summary</value> -- example data
-- cte would pull out 'archiveOptionString;68;<value xsi:type="xsd:string">Officer Product Group Summary'
, filename as -- recursive select to find all 'subject;deliveryOptionEnum;'
(
select cmid, delivoptions, 0 as st, len('filenameStub;archiveOptionEnum;') as ln, 0 as en, cast(null as varchar(max)) as filename
from CMOBJPROPS26
union all
select cmid, delivoptions, t1.st, ln, t2.en, cast(t3.n as varchar(max))
from filename
cross apply (values (charindex('filenameStub;archiveOptionEnum;', delivoptions, filename.st + 1) ) ) t1(st)
cross apply (values (charindex('</value>', delivoptions, t1.st)) ) t2(en)
cross apply (values (case when t1.st > 0 then substring(delivoptions, t1.st + ln, t2.en - (t1.st + ln)) end) ) t3(n)
where t1.st > 0
)
-- calls filename and takes returned text 'deliveryOptionString;73;<value xsi:type="xsd:string">Schedule Test DV02 Version 11.0.13' and pulls off 'Schedule Test DV02 Version 11.0.13'
, filename_select as
(
select cmid, ltrim(rtrim(reverse(left(reverse(filename), charindex('>',reverse(filename)) - 1)))) filename
from filename
where st > 0
)
-- general cte to get most of the schedule information
, "CognosSchedules" AS
(
select ob2.cmid
, ob2.pcmid
, c.name as classname
, n.name as objectname
, JL.reportID
, JL.reportIDparent
, JL.jobID
, JL.jobStepID
, JL.JobStepName
, JL.JobStepType
, z2.name as owner
, LE.LastExecDate
, ob2.CREATED
, ob2.MODIFIED
, p.ACTIVE
, p.TYPE
, case
when p.type=4 then 'WEEKLY'
when p.type=0 then 'DAILY'
when p.type=1 then 'MONTHLY'
when p.type=2 then 'MONTHLY'
when p.type=5 then 'YEARLY'
when p.type=6 then 'YEARLY'
when p.type=7 then 'TRIGGER'
else 'OTHER'
end REPORT_FREQ
, p.STARTDATE
, p.ENDDATE
,case
when p.type=0 then
'EVERY '+cast ( p.EVERYNPERIODS as char(2))+
case when p.DAILYPERIOD=1 then ' HOURS'
when p.DAILYPERIOD=2 then ' MINUTES'
when p.DAILYPERIOD=0 then ' DAYS'
end
WHEN p.type=4 THEN
'EVERY '+cast ( p.EVERYNPERIODS as char(2))+' WEEK(S) ON '+
CASE when p.WEEKLYMONDAY = 1 then 'MONDAY ' ELSE '' end
+ CASE WHEN p.WEEKLYTUESDAY = 1 then 'TUESDAY ' ELSE '' end
+ CASE WHEN p.WEEKLYWEDNESDAY = 1 then 'WEDNESDAY ' ELSE '' end
+ CASE WHEN p.WEEKLYTHURSDAY = 1 then 'THURSDAY ' ELSE '' end
+ CASE WHEN p.WEEKLYFRIDAY = 1 then 'FRIDAY ' ELSE '' end
+ CASE WHEN p.WEEKLYSATURDAY = 1 then 'SATURDAY ' ELSE '' end
+ CASE WHEN p.WEEKLYSUNDAY = 1 then 'SUNDAY' ELSE '' end
WHEN p.type =2 THEN
CASE WHEN p.MONTHLYRELWEEK = 0 then 'FIRST ' ELSE '' end
+ CASE WHEN p.MONTHLYRELWEEK = 3 then 'SECOND ' ELSE '' end
+ CASE WHEN p.MONTHLYRELWEEK = 2 then 'LAST ' ELSE '' end
+ CASE WHEN p.MONTHLYRELWEEK = 1 then 'FOURTH ' ELSE '' end
+ CASE WHEN p.MONTHLYRELWEEK = 4 then 'THIRD ' ELSE '' end
+ CASE WHEN p.MONTHLYRELDAY = 1 THEN 'MONDAY' ELSE '' end
+ CASE WHEN p.MONTHLYRELDAY = 2 THEN 'SATURDAY' ELSE '' end
+ CASE WHEN p.MONTHLYRELDAY = 3 THEN 'SUNDAY' ELSE '' end
+ CASE WHEN p.MONTHLYRELDAY = 4 THEN 'THURSDAY' ELSE '' end
+ CASE WHEN p.MONTHLYRELDAY = 5 THEN 'TUESDAY' ELSE '' end
+ CASE WHEN p.MONTHLYRELDAY = 6 THEN 'WEDNESDAY' ELSE '' end
+ CASE WHEN p.MONTHLYRELDAY = 0 THEN 'FRIDAY' ELSE '' end
+ ' OF EVERY '+cast( p.EVERYNPERIODS as char(1) ) + ' MONTH '
WHEN p.type =1 THEN
'DAY '+ cast( p.MONTHLYABSDAY as char(2)) +' OF EVERY '+ cast( p.EVERYNPERIODS as char(2) ) + ' MONTH(S) '
WHEN p.type =6 THEN
' EVERY '+ ' YEAR AT THE '
+ CASE WHEN p.YEARLYRELWEEK = 0 then 'FIRST ' ELSE ' ' end
+ CASE WHEN p.YEARLYRELWEEK = 1 then 'SECOND ' ELSE '' end
+ CASE WHEN p.YEARLYRELWEEK = 2 then 'THIRD ' ELSE '' end
+ CASE WHEN p.YEARLYRELWEEK = 3 then 'FOURTH ' ELSE '' end
+ CASE WHEN p.YEARLYRELWEEK = 4 then 'LAST ' ELSE '' end
+ CASE WHEN p.YEARLYRELDAY = 1 THEN 'MONDAY' ELSE '' end
+ CASE WHEN p.YEARLYRELDAY = 2 THEN 'SATURDAY' ELSE '' end
+ CASE WHEN p.YEARLYRELDAY = 3 THEN 'SUNDAY' ELSE '' end
+ CASE WHEN p.YEARLYRELDAY = 4 THEN 'THURSDAY' ELSE '' end
+ CASE WHEN p.YEARLYRELDAY = 5 THEN 'TUESDAY' ELSE '' end
+ CASE WHEN p.YEARLYRELDAY = 6 THEN 'WED' ELSE '' end
+ CASE WHEN p.YEARLYRELDAY = 0 THEN 'FRIDAY' ELSE '' end
+ ' OF EVERY '
+ CASE WHEN p.YEARLYRELMONTH = 0 THEN 'JAN' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 1 THEN 'FEB' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 2 THEN 'MAR' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 3 THEN 'APR' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 4 THEN 'MAY' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 5 THEN 'JUN' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 6 THEN 'JUL' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 7 THEN 'AUG' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 8 THEN 'SEP' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 9 THEN 'OCT' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 10 THEN 'NOV' ELSE '' end
+ CASE WHEN p.YEARLYRELMONTH = 11 THEN 'DEC' ELSE '' end
WHEN p.type =5 THEN
'DAY '
+ CAST ( p.YEARLYABSDAY as char(2)) +' OF EVERY '
+ CASE WHEN p.YEARLYABSMONTH = 0 THEN 'JAN' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 1 THEN 'FEB' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 2 THEN 'MAR' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 3 THEN 'APR' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 4 THEN 'MAY' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 5 THEN 'JUN' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 6 THEN 'JUL' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 7 THEN 'AUG' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 8 THEN 'SEP' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 9 THEN 'OCT' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 10 THEN 'NOV' ELSE '' end
+ CASE WHEN p.YEARLYABSMONTH = 11 THEN 'DEC' ELSE '' end
WHEN p.type =7 THEN
'TRIGGER NAME:'+p2.SCHEDTRIGNAME
END SCHEDULE_PLAN
,Email_Address.addresses -- email addresses for report schedules
,Email_Subject_Select.EMail_Subject -- email subjects for report schedules
,Filename_Select.filename -- saved report filename
, p.cmid as schedule_cmid -- schedule id
from CMOBJPROPS2 p -- schedule must exists
inner join CMOBJPROPS26 o on p.cmid=o.cmid
inner join CMOBJPROPS51 p2 on p.CMID=p2.CMID
inner join CMOBJECTS ob on ob.cmid=o.cmid
inner join CMOBJECTS ob2 on ob.pcmid=ob2.cmid
inner join CMOBJNAMES n on n.cmid=ob2.cmid
inner join CMCLASSES c on ob2.classid=c.classid
left join CMREFNOORD2 z1 on z1.cmid = p.cmid
left join CMOBJPROPS33 z2 on z2.CMID = z1.REFCMID
left join Email_Address on o.cmid = Email_Address.cmid -- email addresses for report schedules
left join email_subject_select on o.cmid = email_subject_select.cmid -- email subject for report schedules
left join filename_select on o.cmid = filename_select.cmid -- saved filename output
left join ( -- lastexecdate
select oh.PCMID,
max(ACTEXECTIME) as LastExecDate
from CMOBJPROPS5 h, CMOBJECTS oh
where h.CMID = oh.CMID
and oh.CLASSID = 111
group by oh.PCMID
) LE
on ob2.cmid = LE.PCMID
left join ( -- job steps?
select jobStep.PCMID as jobID
, jobStep.CMID as jobStepID
, r.REFCMID as reportID
, o.PCMID as reportIDparent
, n.NAME as JobStepName
, c.NAME as JobStepType
from CMREFNOORD1 r
INNER JOIN CMOBJECTS jobStep ON r.CMID=jobStep.CMID
INNER JOIN CMOBJECTS o ON r.REFCMID=o.CMID
INNER JOIN CMOBJNAMES n ON r.REFCMID=n.CMID
INNER JOIN CMCLASSES c on o.classid=c.classid
where r.propid=10
and n.isdefault=1
and o.CLASSID in (10, 19, 234, 257)
) JL
on ob2.cmid = JL.jobID
where 1 = 1
)
/*****************************************************************************************************************************/
-- get the object path with recursive query
,COGNOSCONTENT (CMID, PCMID, NAME, PARENT, CONTENT, PATH, LEVELNR, CLASSID)
as (
select
A.CMID
,A.PCMID
,B.NAME
,B.NAME as PARENT
,C.NAME as CONTENT
,cast(B.NAME as varchar(512)) as PATH
,0 as LEVELNR
,a.CLASSID
from CMOBJECTS A
join CMOBJNAMES B on A.CMID = B.CMID
join CMCLASSES C on A.CLASSID = C.CLASSID
where B.ISDEFAULT = 1
and A.PCMID = 0
and A.CMID in ( 2, 4 ) -- 2 is teamcontent, 4 is personal folders
UNION ALL
select
A.CMID
,A.PCMID
,B.NAME as PARENT
,D.NAME
,C.NAME
,cast(D.PATH + '\' + CAST (B.NAME as varchar(512)) as varchar(512)) as PATH
,D.LEVELNR + 1 as LEVELNR
,A.CLASSID
from CMOBJECTS A
join CMOBJNAMES B on A.CMID = b.CMID
join CMCLASSES C on A.CLASSID = C.CLASSID
join COGNOSCONTENT D on A.PCMID = D.CMID
where B.ISDEFAULT = 1
--and A.CLASSID in (1, 5, 8, 18, 32) -- original - folder, account, namespaceFolder, namespace
and A.CLASSID in (1, 5, 8, 10, 18, 19, 32, 55) -- changed for, added 10 and 18, 55, 19 - 19 for report view, 55 for job,
)
,UIDNAAM ( USERNAME, OBJID ) AS -- users
( select
upper(CMOBJPROPS33.NAME) as USERNAME
,CMOBJPROPS1.OBJID
from CMOBJPROPS1 CMOBJPROPS1
join CMOBJPROPS33 CMOBJPROPS33
on CMOBJPROPS1.CMID = CMOBJPROPS33.CMID
)
,NAMESPACE (NAMESPACE_ID) AS -- namespace
( SELECT C.OBJID AS NAMESPACE_ID
from CMOBJECTS A
join CMOBJNAMES B on A.CMID = B.CMID
join CMOBJPROPS1 C on A.CMID = C.CMID
join CMCLASSES D on A.CLASSID = D.CLASSID
where B.ISDEFAULT = 1
and A.CLASSID in (32)
and upper(B.NAME) <> 'COGNOS'
)
SELECT DISTINCT
"CognosSchedules"."CMID" AS "OBJECTCMID",
"CognosSchedules"."PCMID" AS "OBJECTPCMID",
"CognosSchedules".schedule_cmid as "SCHEDULECMID",
"CognosSchedules"."CLASSNAME" AS "CLASSNAME",
"CognosSchedules"."OBJECTNAME" AS "OBJECTNAME",
-- "CognosSchedules"."REPORTID" AS "REPORTID",
-- "CognosSchedules"."REPORTIDPARENT" AS "REPORTIDPARENT",
-- "CognosSchedules"."JOBID" AS "JOBID",
-- "CognosSchedules"."JOBSTEPID" AS "JOBSTEPID",
"CognosSchedules"."JOBSTEPNAME" AS "JOBSTEPNAME",
"CognosSchedules"."JOBSTEPTYPE" AS "JOBSTEPTYPE",
"CognosSchedules"."OWNER" AS "OWNER",
"CognosSchedules"."LASTEXECDATE" AS "LASTEXECDATE",
"CognosSchedules"."CREATED" AS "CREATED",
"CognosSchedules"."MODIFIED" AS "MODIFIED",
"CognosSchedules"."ACTIVE" AS "ACTIVE",
"CognosSchedules"."TYPE" AS "TYPE",
"CognosSchedules"."REPORT_FREQ" AS "REPORT_FREQ",
"CognosSchedules"."STARTDATE" AS "STARTDATE",
"CognosSchedules"."ENDDATE" AS "ENDDATE",
"CognosSchedules"."SCHEDULE_PLAN" AS "SCHEDULE_PLAN",
--"CognosSchedules"."ADDRESSES" AS "ADDRESSES",
--"CognosSchedules"."EMAIL_SUBJECT" AS "EMAIL_SUBJECT",
--email_step.addresses_step AS EMAILSTEP,
coalesce("CognosSchedules"."ADDRESSES", Email_Address1.addresses, Email_Address2.addresses) as EMAILADDRESS, -- report schedule, then job step, then job defaults
coalesce("CognosSchedules"."EMAIL_SUBJECT", Email_Subject1.Email_SUbject, Email_Subject2.Email_Subject) as EMAILSUBJECT, -- report schedule, then job step, then job defaults
coalesce("CognosSchedules"."FileName", FileName1.FileName, Filename2.Filename) as SAVEDFILENAME, -- report schedule, then job step, then job defaults
case
when ( charindex( NAMESP.NAMESPACE_ID + ':u:', CC.PATH) = 0 ) then ( CC.PATH )
else ( ISNULL(UIDNAAM.USERNAME, '') + substring(CC.PATH, charindex('\My Folders', CC.PATH), len(CC.PATH) ) )
end as SCHEDULEPATH,
case
when ( CCSTEP.PATH is null ) then ( CCSTEP.PATH )
when ( charindex(NAMESP.NAMESPACE_ID + ':u:', CCSTEP.PATH) = 0 ) then ( CCSTEP.PATH )
else ( ISNULL(UIDNAAM.USERNAME, '') + substring(CCSTEP.PATH, charindex('\My Folders', CCSTEP.PATH), len(CCSTEP.PATH )) )
end as STEPPATH
FROM "CognosSchedules"
LEFT JOIN COGNOSCONTENT CC on cc.CMID = "CognosSchedules".CMID -- PCMID, changed to CMID to get the path + object
cross join NAMESPACE NAMESP
left join UIDNAAM on substring(CC.PATH, charindex(NAMESP.NAMESPACE_ID + ':u:', CC.PATH), len(NAMESP.NAMESPACE_ID) + 35) = UIDNAAM.OBJID -- was 49, changed to len(NAMESP.NAMESPACE_ID) + 35
LEFT JOIN COGNOSCONTENT CCSTEP on CCSTEP.CMID = "CognosSchedules".REPORTID -- was REPORTIDPARENT, i changed to REPORTID
left join Email_Address Email_Address1 on "CognosSchedules".JOBSTEPID = Email_Address1.cmid -- email addresses for job step schedules
left join email_subject_select Email_Subject1 on "CognosSchedules".JOBSTEPID = Email_Subject1.cmid -- email subject for report schedules
left join Email_Address Email_Address2 on "CognosSchedules".cmid = Email_Address2.cmid -- email addresses for job steps that use the job default
left join email_subject_select Email_Subject2 on "CognosSchedules".cmid = Email_Subject2.cmid -- email subject for job steps that use the job default
left join filename_select as FileName1 on "CognosSchedules".JOBSTEPID = FileName1.cmid -- saved filename output for job step
left join filename_select as FileName2 on "CognosSchedules".cmid = filename2.cmid -- saved filename output for job defaults
ORDER BY 1, "CLASSNAME", "OBJECTNAME", jobstepname
------------------------------
brenda grossnickle
BI Programmer Analyst
FIS
Original Message:
Sent: Fri August 27, 2021 10:43 AM
From: Christine Beswick
Subject: Create a report from the content store db providing details of schedules
Hi everybody,
I need to create a Cognos report from the content store database which will provide details of the scheduled jobs and reports including:
- Name
- Location
- Type (Job, Report, etc)
- Step Name
- Step Location
- Schedule Status
- Schedule Owner
- Next Run Date/ Time
- Trigger (if exists)
- Last Run Date
- Last Run Duration
I am having trouble finding the Last Run Duration and I am hoping there is someone who can assist. I can't use the Audit database because it doesn't have all the information that I need so I have to source the report from the content store
Thanks very much in advance
Regards,
Christine
------------------------------
Christine Beswick
------------------------------
#CognosAnalyticswithWatson