SSRS subscription migration - reporting-services
I have several SSRS subscriptions built but my company just did a domain conversion and those subscriptions are all saved to my old domain login. This had led to a few questions:
1) Is there a way to move all those subscriptions to my new account?
2) Is it possible to setup the subscriptions to be viewable by multiple users?
3) Is it possible to setup the subscriptions to be editable by multiple users?
We are using SSRS 2012
I had to do this a few times at my last organization.
To answer your first question, I use the script below to update the subscription and report owners. I use SQL Command Mode to easily change to different servers. It is also necessary for the variables.
To turn on SQL Command Mode in SSMS, on the menu bar click on Query | SQLCMD Mode
Note: The NewUser must already exist in dbo.Users and you must have UPDATE permission on the dbo.ReportServer database to use this script.
/*------------------------------------------------------------------------------+
| Purpose: To Update the owner of deployed reports and subscriptions
| Note: SQLCmdMode Script
+--------------------------------------------------------------------------------
*/
:setvar _server "***YourServerNameHere***"
:setvar _database "ReportServer"
:connect $(_server)
USE [$(_database)];
GO
:SETVAR OldUser "DOMAIN\OldUserName"
:SETVAR NewUser "DOMAIN\NewUserName"
SET XACT_ABORT ON
BEGIN TRANSACTION
PRINT '====================================================================='
PRINT 'Update subscriptions...'
PRINT '====================================================================='
;WITH
new_owner
AS
(
SELECT [UserID], [UserName] FROM dbo.[Users] WHERE [UserName] = N'$(NewUser)'
)
,
subscription_source
AS
(
SELECT
s.[Report_OID]
, [OldOwner] = ou.[UserName]
, [OldOwnerID] = ou.[UserID]
, [NewOwner] = nu.[UserName]
, [NewOwnerID] = nu.[UserID]
FROM
dbo.[Subscriptions] AS s
INNER JOIN dbo.[Users] AS ou ON ou.[UserID] = s.[OwnerID]
, new_owner AS nu
WHERE
1=1
AND ou.[UserName] = N'$(OldUser)'
)
--SELECT * FROM subscription_source
MERGE dbo.Subscriptions AS T
USING subscription_source AS S ON T.[Report_OID] = S.[Report_OID]
WHEN MATCHED
THEN UPDATE SET
T.[OwnerID] = S.[NewOwnerID]
OUTPUT ##ServerName AS ServerName, db_name() AS DatabaseName, $action, inserted.*, deleted.*;
PRINT '====================================================================='
PRINT 'Update report created by...'
PRINT '====================================================================='
;WITH
new_owner
AS
(
SELECT [UserID], [UserName] FROM dbo.[Users] WHERE [UserName] = N'$(NewUser)'
)
,
report_list_source
AS
(
SELECT
c.[ItemID]
, c.[Name]
, [OldOwner] = ou.[UserName]
, [OldOwnerID] = ou.[UserID]
, [NewOwner] = nu.[UserName]
, [NewOwnerID] = nu.[UserID]
FROM
dbo.[Catalog] AS c
INNER JOIN dbo.[Users] AS ou ON ou.[UserID] = c.[CreatedById]
, new_owner AS nu
WHERE
1=1
AND ou.[UserName] = N'$(OldUser)'
AND c.[Type] = 2
)
--SELECT * FROM report_list_source
MERGE dbo.[Catalog] AS T
USING report_list_source AS S ON T.[ItemID] = S.[ItemID]
WHEN MATCHED
THEN UPDATE SET
T.[CreatedById] = S.[NewOwnerID]
OUTPUT ##ServerName AS ServerName, db_name() AS DatabaseName, $action, inserted.*, deleted.*;
PRINT '====================================================================='
PRINT 'Update report modified by...'
PRINT '====================================================================='
;WITH
new_owner
AS
(
SELECT [UserID], [UserName] FROM dbo.[Users] WHERE [UserName] = N'$(NewUser)'
)
,
report_list_source
AS
(
SELECT
c.[ItemID]
, c.[Name]
, [OldOwner] = ou.[UserName]
, [OldOwnerID] = ou.[UserID]
, [NewOwner] = nu.[UserName]
, [NewOwnerID] = nu.[UserID]
FROM
dbo.[Catalog] AS c
INNER JOIN dbo.[Users] AS ou ON ou.[UserID] = c.[ModifiedById]
, new_owner AS nu
WHERE
1=1
AND ou.[UserName] = N'$(OldUser)'
AND c.[Type] = 2
)
--SELECT * FROM report_list_source
MERGE dbo.[Catalog] AS T
USING report_list_source AS S ON T.[ItemID] = S.[ItemID]
WHEN MATCHED
THEN UPDATE SET
T.[ModifiedById] = S.[NewOwnerID]
OUTPUT ##ServerName AS ServerName, db_name() AS DatabaseName, $action, inserted.*, deleted.*;
PRINT '******* ROLLBACK TRANSACTION ******* ';
ROLLBACK TRANSACTION;
--PRINT '******* COMMIT TRANSACTION ******* ';
--COMMIT TRANSACTION;
PRINT '====================================================================='
PRINT 'Finished...'
PRINT '====================================================================='
To answer your second question, I wrote a report to view all the subscriptions. Below is the report SQL. Here is the rdl file if you just want to download that.
/*'------------------------------------------------------------------------------------------------------------------
| Purpose: Schedule Of Recurring Report Subscriptions
| Note: SQLCmdMode Script
'--------------------------------------------------------------------------------------------------------------------
DECLARE #all_value AS VARCHAR(100)
DECLARE #ReportFolder AS VARCHAR(100)
DECLARE #ReportName AS VARCHAR(100)
DECLARE #EmailLike AS VARCHAR(100)
DECLARE #ModifiedBy AS VARCHAR(50)
DECLARE #SubcriptionOwner AS VARCHAR(50)
DECLARE #SubscriptionStatus AS VARCHAR(1)
DECLARE #EventStatus AS VARCHAR(50)
DECLARE #Current AS VARCHAR(50)
DECLARE #LastSubscriptionDate AS DATETIME
SET #all_value = '<ALL>'
SET #ReportFolder = '<ALL>'
SET #ReportName = '<ALL>'
SET #EmailLike = NULL
SET #ModifiedBy = NULL
SET #SubcriptionOwner = NULL
SET #SubscriptionStatus = 'A' -- Y=Sent, N=Fail, A=All
SET #EventStatus = '<ALL>' -- status from ReportServer.dbo.ExecutionLog
SET #Current = '<ALL>'
SET #LastSubscriptionDate = NULL --getdate()-1
*/
;WITH
report_users
AS
(
SELECT [UserID], [UserName], [SimpleUserName] = UPPER(RIGHT([UserName],(LEN([UserName])-CHARINDEX('\',[UserName])))) FROM dbo.[Users]
)
,
report_catalog
AS
(
SELECT
c.[ItemID]
, c.[CreatedById]
, c.[ModifiedById]
, c.[Type]
, c.[Name]
, c.[Description]
, c.[Parameter]
, [ReportCreationDate] = CONVERT(DATETIME, CONVERT(VARCHAR(11), c.[CreationDate], 13))
, [ReportModifiedDate] = CONVERT(DATETIME, CONVERT(VARCHAR(11), c.[ModifiedDate], 13))
, [ReportFolder] =
CASE
WHEN c.[Path] = '/' + c.[Name] THEN ''
ELSE SUBSTRING(c.[Path], 2, Len(c.[Path])-Len(c.[Name])-2)
END
, [ReportPath] = c.[Path]
, [UrlPath] = 'http://' + Host_Name() + '/Reports/Pages/Folder.aspx?ItemPath=%2f'
, [ReportDefinition] = CONVERT(VARCHAR(MAX),CONVERT(VARBINARY(MAX), c.[Content]))
FROM
dbo.[Catalog] AS c
WHERE c.[Type] = 2
)
,
subscription_days
AS
(
SELECT tbl.* FROM (VALUES
( 'DaysOfMonth', 1, '1')
, ( 'DaysOfMonth', 2, '2')
, ( 'DaysOfMonth', 4, '3')
, ( 'DaysOfMonth', 8, '4')
, ( 'DaysOfMonth', 16, '5')
, ( 'DaysOfMonth', 32, '6')
, ( 'DaysOfMonth', 64, '7')
, ( 'DaysOfMonth', 128, '8')
, ( 'DaysOfMonth', 256, '9')
, ( 'DaysOfMonth', 512, '10')
, ( 'DaysOfMonth', 1024, '11')
, ( 'DaysOfMonth', 2048, '12')
, ( 'DaysOfMonth', 4096, '13')
, ( 'DaysOfMonth', 8192, '14')
, ( 'DaysOfMonth', 16384, '15')
, ( 'DaysOfMonth', 32768, '16')
, ( 'DaysOfMonth', 65536, '17')
, ( 'DaysOfMonth', 131072, '18')
, ( 'DaysOfMonth', 262144, '19')
, ( 'DaysOfMonth', 524288, '20')
, ( 'DaysOfMonth', 1048576, '21')
, ( 'DaysOfMonth', 2097152, '22')
, ( 'DaysOfMonth', 4194304, '23')
, ( 'DaysOfMonth', 8388608, '24')
, ( 'DaysOfMonth', 16777216, '25')
, ( 'DaysOfMonth', 33554432, '26')
, ( 'DaysOfMonth', 67108864, '27')
, ( 'DaysOfMonth', 134217728, '28')
, ( 'DaysOfMonth', 268435456, '29')
, ( 'DaysOfMonth', 536870912, '30')
, ( 'DaysOfMonth', 1073741824, '31')
, ( 'DaysOfMonth', 8193, '1st and 14th')
, ( 'DaysOfWeek', 1, 'Sun')
, ( 'DaysOfWeek', 2, 'Mon')
, ( 'DaysOfWeek', 4, 'Tues')
, ( 'DaysOfWeek', 8, 'Wed')
, ( 'DaysOfWeek', 16, 'Thurs')
, ( 'DaysOfWeek', 32, 'Fri')
, ( 'DaysOfWeek', 64, 'Sat')
, ( 'DaysOfWeek', 62, 'Mon - Fri')
, ( 'DaysOfWeek', 10, 'Mon - Wed')
, ( 'DaysOfWeek', 24, 'Wed - Thurs')
, ( 'DaysOfWeek', 120, 'Wed - Sat')
, ( 'DaysOfWeek', 126, 'Mon - Sat')
, ( 'DaysOfWeek', 127, 'Daily')
, ( 'DayOfWeek', 1, 'Sun')
, ( 'DayOfWeek', 127, 'Sun')
, ( 'DayOfWeek', 2, 'Mon')
, ( 'DayOfWeek', 10, 'Mon')
, ( 'DayOfWeek', 62, 'Mon')
, ( 'DayOfWeek', 126, 'Mon')
, ( 'DayOfWeek', 127, 'Mon')
, ( 'DayOfWeek', 4, 'Tue')
, ( 'DayOfWeek', 10, 'Tue')
, ( 'DayOfWeek', 62, 'Tue')
, ( 'DayOfWeek', 126, 'Tue')
, ( 'DayOfWeek', 127, 'Tue')
, ( 'DayOfWeek', 8, 'Wed')
, ( 'DayOfWeek', 10, 'Wed')
, ( 'DayOfWeek', 24, 'Wed')
, ( 'DayOfWeek', 62, 'Wed')
, ( 'DayOfWeek', 120, 'Wed')
, ( 'DayOfWeek', 126, 'Wed')
, ( 'DayOfWeek', 127, 'Wed')
, ( 'DayOfWeek', 16, 'Thr')
, ( 'DayOfWeek', 24, 'Thr')
, ( 'DayOfWeek', 62, 'Thr')
, ( 'DayOfWeek', 120, 'Thr')
, ( 'DayOfWeek', 126, 'Thr')
, ( 'DayOfWeek', 127, 'Thr')
, ( 'DayOfWeek', 32, 'Fri')
, ( 'DayOfWeek', 62, 'Fri')
, ( 'DayOfWeek', 120, 'Fri')
, ( 'DayOfWeek', 126, 'Fri')
, ( 'DayOfWeek', 127, 'Fri')
, ( 'DayOfWeek', 64, 'Sat')
, ( 'DayOfWeek', 120, 'Sat')
, ( 'DayOfWeek', 126, 'Sat')
, ( 'DayOfWeek', 127, 'Sat')
) tbl ([GroupName], [CodeNbr], [Label])
)
,
subscription_schedule
AS
(
SELECT
[ScheduleID]
, [SchDaySun] = Sun
, [SchDayMon] = Mon
, [SchDayTue] = Tue
, [SchDayWed] = Wed
, [SchDayThr] = Thr
, [SchDayFri] = Fri
, [SchDaySat] = Sat
, [ScheduleName]
, [ScheduleStartDate]
, [ScheduleEndDate]
, [Flags]
, [RecurrenceType]
, [State]
, [MinutesInterval]
, [DaysInterval]
, [WeeksInterval]
, [DaysOfWeek]
, [DaysOfMonth]
, [Month]
, [MonthlyWeek]
, [ScheduleDays]
FROM
(
SELECT
sc.[ScheduleID]
, sd.[CodeNbr]
, sd.[Label]
, [ScheduleName] = sc.[name]
, [ScheduleStartDate] = sc.[StartDate]
, [ScheduleEndDate] = sc.[EndDate]
, sc.[Flags]
, sc.[RecurrenceType]
, sc.[State]
, sc.[MinutesInterval]
, sc.[DaysInterval]
, sc.[WeeksInterval]
, sc.[DaysOfWeek]
, sc.[DaysOfMonth]
, sc.[Month]
, sc.[MonthlyWeek]
, [ScheduleDays] =
CASE
WHEN sc.[DaysOfMonth] IS NOT NULL THEN COALESCE(dom.[Label], '(' + CAST(sc.[DaysOfMonth] AS VARCHAR(20)) + ') NOT CODED')
WHEN sc.[DaysOfWeek] IS NOT NULL THEN COALESCE(dow.[Label], '(' + CAST(sc.[DaysOfWeek] AS VARCHAR(20)) + ') NOT CODED')
END
--, sc.[RecurrenceType]
FROM
dbo.[Schedule] sc
LEFT JOIN subscription_days sd ON sc.[DaysOfWeek] = sd.[CodeNbr] AND sd.[GroupName] = 'DayOfWeek'
LEFT JOIN subscription_days AS dom ON sc.[DaysOfMonth] = dom.[CodeNbr] AND dom.[GroupName] = 'DaysOfMonth'
LEFT JOIN subscription_days AS dow ON sc.DaysOfWeek = dow.CodeNbr AND dow.[GroupName] = 'DaysOfWeek'
) sch
PIVOT
(
COUNT(sch.[Label])
FOR sch.[Label]
IN ([Sun], [Mon], [Tue], [Wed], [Thr], [Fri], [Sat])
) AS pvt
)
,
report_subscription
AS
(
SELECT
s.[SubscriptionID]
, s.[Report_OID]
, [SubscriptionDescription] = s.[Description]
, s.[ExtensionSettings]
, s.[EventType]
, s.[OwnerID]
, s.[ModifiedByID]
, s.[ModifiedDate]
, [RunTime] = CONVERT(VARCHAR(5), s.[LastRunTime], 8)
, [LastRunDate] = CONVERT(VARCHAR(11),s.[LastRunTime],13)
, s.[LastRunTime]
, s.[DeliveryExtension]
, s.[MatchData]
, [SubscriptionLastStatus] = s.[LastStatus]
, [StatusFail] = CASE WHEN s.[LastStatus] LIKE '%Mail sent%' THEN 'N' ELSE 'Y' END
, [EmailSubject] = CASE CHARINDEX('<Name>SUBJECT</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>SUBJECT</Name><Value>') + CHARINDEX('<Name>SUBJECT</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>SUBJECT</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>SUBJECT</Name><Value>') + CHARINDEX('<Name>SUBJECT</Name><Value>', s.ExtensionSettings))) END
, [EmailTo] = SUBSTRING(s.ExtensionSettings, LEN('<Name>TO</Name><Value>') + CHARINDEX('<Name>TO</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>TO</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>TO</Name><Value>') + CHARINDEX('<Name>TO</Name><Value>', s.ExtensionSettings)))
, [EmailCc] = CASE CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>CC</Name><Value>') + CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>CC</Name><Value>') + CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings))) END
, [EmailBcc] = CASE CHARINDEX('<Name>BCC</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>BCC</Name><Value>') + CHARINDEX('<Name>BCC</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>BCC</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>BCC</Name><Value>') + CHARINDEX('<Name>BCC</Name><Value>', s.ExtensionSettings))) END
, [EmailComment] = CASE CHARINDEX('<Name>Comment</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>Comment</Name><Value>') + CHARINDEX('<Name>Comment</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>Comment</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>Comment</Name><Value>') + CHARINDEX('<Name>Comment</Name><Value>', s.ExtensionSettings))) END
, [EmailIncludeLink] = CASE CHARINDEX('<Name>IncludeLink</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>IncludeLink</Name><Value>') + CHARINDEX('<Name>IncludeLink</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>IncludeLink</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>IncludeLink</Name><Value>') + CHARINDEX('<Name>IncludeLink</Name><Value>', s.ExtensionSettings))) END
, [EmailRenderFormat] = CASE CHARINDEX('<Name>RenderFormat</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>RenderFormat</Name><Value>') + CHARINDEX('<Name>RenderFormat</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>RenderFormat</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>RenderFormat</Name><Value>') + CHARINDEX('<Name>RenderFormat</Name><Value>', s.ExtensionSettings))) END
, [EmailPriority] = CASE CHARINDEX('<Name>Priority</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>Priority</Name><Value>') + CHARINDEX('<Name>Priority</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>Priority</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>Priority</Name><Value>') + CHARINDEX('<Name>Priority</Name><Value>', s.ExtensionSettings))) END
, sch.[MinutesInterval]
, sch.[DaysInterval]
, sch.[WeeksInterval]
, sch.[DaysOfWeek]
, sch.[DaysOfMonth]
, sch.[Month]
, sch.[MonthlyWeek]
--, [JobName] = sj.[name]
, sch.[ScheduleName]
, sch.[ScheduleDays]
, sch.[SchDaySun]
, sch.[SchDayMon]
, sch.[SchDayTue]
, sch.[SchDayWed]
, sch.[SchDayThr]
, sch.[SchDayFri]
, sch.[SchDaySat]
, sch.[ScheduleStartDate]
, sch.[ScheduleEndDate]
, sch.[Flags]
, sch.[RecurrenceType]
, sch.[State]
FROM
dbo.[Subscriptions] AS s
LEFT JOIN dbo.[Notifications] AS n ON n.[SubscriptionID] = s.[SubscriptionID] AND s.[Report_OID] = n.[ReportID]
LEFT JOIN dbo.[ReportSchedule] AS rs ON s.[SubscriptionID] = rs.[SubscriptionID]
--LEFT JOIN MSDB.dbo.[sysjobs] AS sj ON sj.[name] = CAST(rs.[ScheduleID] AS VARCHAR(255))
LEFT JOIN subscription_schedule AS sch ON rs.[ScheduleID] = sch.[ScheduleID]
WHERE
1=1
--AND sch.[RecurrenceType] IN(4,5) -- 1 = is one off, 4 = daily, 5 = monthly
--AND s.EventType = 'TimedSubscription'
)
SELECT
c.[Name]
, c.[Description]
, c.[Parameter]
, c.[ReportFolder]
, c.[ReportPath]
, [URL_ReportFolder] = c.[UrlPath] + c.[ReportFolder] + '&ViewMode=List'
, [URL_Report] = c.[UrlPath] + c.[ReportFolder] + '%2f' + c.Name
, [URL] = 'http://' + Host_Name() + '/Reports/Pages/SubscriptionProperties.aspx?ItemPath=' + c.ReportPath + '&IsDataDriven=False&SubscriptionID=' + CAST(s.SubscriptionID AS VARCHAR(80))
, [URL2] = 'http://' + Host_Name() + '/Reports/Pages/Report.aspx?ItemPath=' + c.[ReportPath] + '&SelectedTabId=SubscriptionsTab'
, [ReportCreatedBy] = urc.[SimpleUserName]
, c.[ReportCreationDate]
, [ReportModifiedBy] = urm.[SimpleUserName]
, c.[ReportModifiedDate]
, [SubscriptionOwner] = usc.[SimpleUserName]
, [SubscriptionModifiedBy] = usm.[SimpleUserName]
, [SubscriptionModifiedDate] = s.[ModifiedDate]
, s.[SubscriptionID]
, s.[SubscriptionDescription]
, s.[ExtensionSettings]
, s.[EventType]
, s.[EmailSubject]
, s.[EmailTo]
, s.[EmailCc]
, s.[EmailBcc]
, s.[EmailComment]
, s.[EmailIncludeLink]
, s.[EmailRenderFormat]
, s.[EmailPriority]
, s.[DeliveryExtension]
, s.[SubscriptionLastStatus]
, s.[StatusFail]
, s.[MatchData]
, s.[RunTime]
, s.[LastRunDate]
, s.[LastRunTime]
, s.[MinutesInterval]
, s.[DaysInterval]
, s.[WeeksInterval]
, s.[DaysOfWeek]
, s.[DaysOfMonth]
, s.[Month]
, s.[MonthlyWeek]
, [JobName] = NULL --, s.[JobName]
, s.[ScheduleName]
, s.[ScheduleDays]
, s.[SchDaySun]
, s.[SchDayMon]
, s.[SchDayTue]
, s.[SchDayWed]
, s.[SchDayThr]
, s.[SchDayFri]
, s.[SchDaySat]
, s.[ScheduleStartDate]
, s.[ScheduleEndDate]
, s.[Flags]
, s.[RecurrenceType]
, s.[State]
, [EventStatus] = el.[Status]
, [EventDateTime] = el.[TimeEnd]
FROM
report_catalog AS c
INNER JOIN report_subscription AS s ON s.[Report_OID] = c.[ItemID]
LEFT OUTER JOIN (SELECT b.[ReportID], b.[Status], b.[TimeEnd]
FROM dbo.[ExecutionLog] b
INNER JOIN (SELECT [ReportID], MAX([TimeEnd]) AS [TimeEnd]
FROM dbo.[ExecutionLog]
GROUP BY [ReportID]) a ON b.[ReportID] = a.[ReportID] AND b.[TimeEnd] = a.[TimeEnd]
)AS el ON el.[ReportID] = c.[ItemID]
LEFT OUTER JOIN report_users AS urc ON c.[CreatedById] = urc.[UserID]
LEFT OUTER JOIN report_users AS urm ON c.[ModifiedById] = urm.[UserID]
LEFT OUTER JOIN report_users AS usc ON s.[OwnerID] = usc.[UserID]
LEFT OUTER JOIN report_users AS usm ON s.[ModifiedByID] = usm.[UserID]
WHERE
1=1
AND c.[Type] = 2
AND (#all_value IN (#ReportFolder) OR c.[ReportFolder] IN(#ReportFolder))
AND (#all_value IN (#ReportFolder) OR CHARINDEX(#ReportFolder, c.[ReportPath]) > 0)
AND (#all_value IN(#ReportName) OR c.[Name] IN(#ReportName))
AND (#all_value IN(#EventStatus) OR el.[Status] IN(#EventStatus))
AND (#all_value IN(#Current) OR CASE WHEN s.[ScheduleEndDate] IS NULL THEN 'Current' WHEN s.[ScheduleEndDate] IS NOT NULL THEN 'Non Current' END = #Current)
AND (#all_value IN(#SubscriptionStatus) OR s.[SubscriptionLastStatus] LIKE '%' + #SubscriptionStatus + '%')
AND (s.[LastRunTime] >= #LastSubscriptionDate OR #LastSubscriptionDate IS NULL)
AND
(
(SUBSTRING(s.[ExtensionSettings], LEN('<Name>TO</Name><Value>') + CHARINDEX('<Name>TO</Name><Value>', s.[ExtensionSettings]), CHARINDEX('</Value>', s.[ExtensionSettings], CHARINDEX('<Name>TO</Name><Value>', s.[ExtensionSettings]) + 1) - (LEN('<Name>TO</Name><Value>') + CHARINDEX('<Name>TO</Name><Value>', s.[ExtensionSettings])))
LIKE '%' + #EmailLike + '%' OR #EmailLike IS NULL
)
OR
(
CASE CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings)
WHEN 0 THEN ''
ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>CC</Name><Value>') + CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>CC</Name><Value>') + CHARINDEX('<Name>CC</Name><Value>', s.[ExtensionSettings])))
END
LIKE '%' + #EmailLike + '%'
)
OR
(
CASE CHARINDEX('<Name>BCC</Name><Value>', s.[ExtensionSettings])
WHEN 0 THEN ''
ELSE SUBSTRING(s.[ExtensionSettings], LEN('<Name>BCC</Name><Value>') + CHARINDEX('<Name>BCC</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.[ExtensionSettings], CHARINDEX('<Name>BCC</Name><Value>', s.[ExtensionSettings]) + 1) - (LEN('<Name>BCC</Name><Value>') + CHARINDEX('<Name>BCC</Name><Value>', s.[ExtensionSettings])))
END
LIKE '%' + #EmailLike + '%')
)
To answer your third question, I would use roles in the report folders to manage permissions.
In SSRS, new roles and adjustments to existing roles must be performed in SQL Server Management studio, SSMS. After opening up SSMS, click on "Connect" and select "Reporting Services…"
Enter your Server Name and login information and then click Connect.
After connecting to the Report Server, open the Security Folder right click on "Roles" and click on "New Role…"
You can create a new role Subscription Editor or Functional Owner and then you can assign permissions to the new roles based on what you want the user(s) to be able to do.
Then on the report manager click on the down arrow for a folder and select "Security"
Then click "New Role Assignment"
Then enter the Active Directory group or an email address and check the new role you created.
Here is a more detailed wiki I wrote for report server permission on MSDN.
Related
Convert SQL query to Eloquent Laravel with many join
How do I convert this query to Eloquent syntax select * from ( select f85 , f86 , f87 , f88 , v1_position_id , v1_companyuser_id , v89.position_value f89 from ( select f85 , f86 , f87 , v1_position_id , v1_companyuser_id , v88.position_value f88 from ( select f85 , f86 , v1_position_id , v1_companyuser_id , v87.position_value f87 from ( select f85 , v1_position_id , v1_companyuser_id , v86.position_value f86 from ( SELECT v1.position_id v1_position_id , v1.companyuser_id v1_companyuser_id , v1.position_value f85 FROM all_position_template_with_data v1 WHERE v1.position_id = 25 AND companyuser_id = 1 AND position_template_id = 85 ) v1 join all_position_template_with_data v86 on v1_position_id = v86.position_id AND v1_companyuser_id = v86.companyuser_id AND v86.position_template_id = 86 ) v86 join all_position_template_with_data v87 on v1_position_id = v87.position_id AND v1_companyuser_id = v87.companyuser_id AND v87.position_template_id = 87 ) v87 join all_position_template_with_data v88 on v1_position_id = v88.position_id AND v1_companyuser_id = v88.companyuser_id AND v88.position_template_id = 88 ) v88 join all_position_template_with_data v89 on v1_position_id = v89.position_id AND v1_companyuser_id = v89.companyuser_id AND v89.position_template_id = 89 ) v89
sql server 2008 CTE Bucket filling
I found below bucket filling query, however I want to extend this from using single filler value to able to use a filler table. Please see the query with sample data, all I want to be able to join my filler table and recursion to work as is, currently I am picking single item from filler. Please have a look at this thread to have full context of this problem. http://www.sqlservercentral.com/Forums/Topic568498-338-1.aspx Thank you. DECLARE #Buckets TABLE ( bucketID INT , FullCapacity INT , currentamount INT ); DECLARE #Filler TABLE ( ID INT, Filler INT ); INSERT INTO #Buckets VALUES ( '1', 85, 0 ) , ( '2', 80, 0 ) , ( '3', 75, 0 ) , ( '4', 70, 0 ) , ( '5', 50, 0 ) , ( '6', 40, 0 ); INSERT INTO #Filler VALUES ( '1', 90 ) , ( '2', 40 ) , ( '3', 70 ) , ( '4', 50 ) , ( '5', 40 ) , ( '6', 30 ) , ( '7', 35 ); DECLARE #AmountToAllocate INT = ( SELECT TOP 1 Filler FROM #Filler ); --single filler amount ;WITH Calculator AS ( SELECT bucketID , FullCapacity , currentamount , AmountLeftToAllocate = CASE WHEN #AmountToAllocate > ( FullCapacity - currentamount ) THEN #AmountToAllocate - ( FullCapacity - currentamount ) WHEN #AmountToAllocate < 0 AND ABS(#AmountToAllocate) > currentamount THEN currentamount + #AmountToAllocate ELSE 0 END , NewAmount = CASE WHEN #AmountToAllocate > ( FullCapacity - currentamount ) THEN FullCapacity WHEN #AmountToAllocate < 0 AND ABS(#AmountToAllocate) > currentamount THEN 0 ELSE currentamount + #AmountToAllocate END FROM #Buckets WHERE bucketID = 1 UNION ALL SELECT tr.bucketID , tr.FullCapacity , tr.currentamount , AmountLeftToAllocate = CASE WHEN lr.AmountLeftToAllocate > ( tr.FullCapacity - tr.currentamount ) THEN lr.AmountLeftToAllocate - ( tr.FullCapacity - tr.currentamount ) WHEN lr.AmountLeftToAllocate < 0 AND ABS(lr.AmountLeftToAllocate) > tr.currentamount THEN tr.currentamount + lr.AmountLeftToAllocate ELSE 0 END , NewAmount = CASE WHEN lr.AmountLeftToAllocate > ( tr.FullCapacity - tr.currentamount ) THEN tr.FullCapacity WHEN lr.AmountLeftToAllocate < 0 AND ABS(lr.AmountLeftToAllocate) > tr.currentamount THEN 0 ELSE tr.currentamount + lr.AmountLeftToAllocate END FROM #Buckets tr INNER JOIN Calculator lr ON lr.bucketID + 1 = tr.bucketID ) SELECT bucketID , FullCapacity , Amount = NewAmount , OldAmount = currentamount FROM Calculator;
In SQL 2012, but still trying to find a solution in SQL 2008. DROP TABLE #Buckets CREATE TABLE #Buckets (bucketID INT, FullCapacity INT, CurrentAmount INT); INSERT INTO #Buckets VALUES ( '1', 85, 0 ) , ( '2', 80, 0 ) , ( '3', 75, 0 ) , ( '4', 70, 0 ) , ( '5', 50, 0 ) , ( '6', 40, 0 ); DROP TABLE #Filler CREATE TABLE #Filler (FillerID INT, Filler INT); INSERT INTO #Filler VALUES ( '1', 90 ) , ( '2', 40 ) , ( '3', 70 ) , ( '4', 50 ) , ( '5', 40 ) , ( '6', 30 ) , ( '7', 35 ); WITH ProcessedDebits AS ( SELECT bucketID, FullCapacity, [from] = ([to] - FullCapacity), [to] FROM (SELECT *, [to] = SUM(FullCapacity) OVER (PARTITION BY 1 ORDER BY bucketID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM #Buckets) d ), ProcessedCredits AS ( SELECT FillerID, Filler, [from] = ([to] - Filler), [to] FROM (SELECT *, [to] = SUM(Filler) OVER (PARTITION BY 1 ORDER BY FillerID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM #Filler) d ) SELECT bucketID, FullCapacity, DebitBalance = CASE WHEN dr.[to] >= cr.[to] THEN (dr.[to] - cr.[to]) WHEN dr.[to] < cr.[to] THEN 0 ELSE dr.[to] - MAX(cr.[to]) OVER(PARTITION BY 1 ORDER BY dr.bucketID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) END, FillerID, Filler, CreditBalance = CASE WHEN cr.[to] >= dr.[to] THEN (cr.[to] - dr.[to]) WHEN cr.[to] < dr.[to] THEN 0 ELSE cr.[to] - MAX(dr.[to]) OVER(PARTITION BY 1 ORDER BY cr.FillerID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) END FROM ProcessedDebits dr FULL OUTER JOIN ProcessedCredits cr ON cr.[from] < dr.[to] AND cr.[to] > dr.[from] ORDER BY bucketID, FillerID OPTION (MAXDOP 1);
SQL Query /stored procedure to get complete organization hierarchy detail
I tried and searched the solution for the below problem statement but unfortunately I didn't get the exact output. I need to display the complete organizational hierarchy in the below format. I tried with using CTE with UNION ALL but still I'm unable to get the exact output. Table structure: CREATE TABLE EMPMASTER ( EMPID CHAR(10), EMPNAME NVARCHAR(50), EMPDESIG VARCHAR(20), MRGID CHAR(10) ); Output: EMPNAME EMPID EMP DESIGNATION ------------------------------------ EMP1 00001 CEO EMP2 00009 MANAGER 1 EMP3 00005 TL1 EMP4 00003 SSD1 EMP5 00006 SD1 EMP6 00008 TL2 EMP7 00020 SSD2 EMP8 25 SD2 EMP9 00030 TL3 EMP10 00017 MANAGER2 EMP11 00029 TL4 EMP12 00045 SSD3 EMP13 00060 SSD4 EMP14 00070 SD3 EMP15 00060 SD4 EMP16 00090 SD5 EMP17 00055 SD6 CONTI… CONTI… CONTI… Code that I tried: WITH HierarchyTree (EMPID, EMPNAME, EMPDESIG, MRGID, Rank) AS ( -- Anchor member definition SELECT EMPID, EMPNAME, EMPDESIG, MRGID, 0 AS Rank FROM EMPMASTER AS e WHERE DESIGNATION = 'Admin' AND EMPLOYEE_ID='1' UNION ALL -- Recursive member definition SELECT e.EMPID, e.EMPNAME, e.EMPDESIG, e.MRGID, Rank + 1 FROM EMPMASTER AS e INNER JOIN HierarchyTree AS d ON e.REPORTINGTO = d.EMPLOYEE_ID ) SELECT EMPID, EMPNAME, DESIGNATION, REPORTINGTO, Rank FROM HierarchyTree Sample data EMPID EMPNAME EMPDESIG MRGID 1 RAM CEO 0 7326 MOHD RAFI MANAGER 7454 7454 PMT PHARMA MANAGER 1 2094 VAC SANJAY DEVELOPER 14005 602 GS MANAGER 7454 412 RAJESH LEAD 602 14005 VAC SM N LEAD 7326 34395 DEEPAK LEAD 7326 16430 VIJAY DEVELOPER 34395
I would venture to suggest an answer based on the hierarchy diagram: declare #EMPMASTER table ( EMPID CHAR(10) , EMPNAME NVARCHAR(50) , EMPDESIG VARCHAR(20) , MRGID CHAR(10) ); insert into #EMPMASTER values ( '00001', 'EMP1', 'CEO', null ), ( '00002', 'EMP2', 'MANAGER1', '00001' ), ( '00003', 'EMP3', 'TL1', '00002' ), ( '00004', 'EMP4', 'SSD1', '00003' ), ( '00005', 'EMP5', 'SD1', '00004' ), ( '00006', 'EMP6', 'TL2', '00002' ), ( '00007', 'EMP7', 'SSD2', '00006' ), ( '00008', 'EMP8', 'SD2', '00007' ), ( '00009', 'EMP9', 'TL3', '00002' ), ( '00010', 'EMP10', 'MANAGER2', '00001' ), ( '00011', 'EMP11', 'TL4', '00010' ), ( '00012', 'EMP12', 'SSD3', '00011' ), ( '00013', 'EMP13', 'SSD4', '00011' ), ( '00014', 'EMP14', 'SD3', '00013' ), ( '00015', 'EMP15', 'SD4', '00013' ), ( '00016', 'EMP16', 'SD5', '00013' ), ( '00017', 'EMP17', 'SD6', '00013' ), ( '00018', 'EMP18', 'MANAGER3', '00001' ), ( '00019', 'EMP19', 'TL5', '00018' ), ( '00020', 'EMP20', 'SSD5', '00019' ), ( '00021', 'EMP21', 'SSD6', '00019' ), ( '00022', 'EMP22', 'SD7', '00021' ), ( '00023', 'EMP23', 'SD8', '00021' ), ( '00024', 'EMP24', 'TL6', '00018' ), ( '00025', 'EMP25', 'SSD7', '00024' ); with cte as ( select EMPID , EMPNAME , EMPDESIG , MRGID , LEVEL = 0, PATH = cast(EMPDESIG as varchar(8000)) from #EMPMASTER where MRGID is null UNION ALL select t.EMPID , t.EMPNAME , t.EMPDESIG , t.MRGID , LEVEL = cte.LEVEL + 1, PATH = cast(cte.PATH + ' > '+ t.EMPDESIG as varchar(8000)) from #EMPMASTER t inner join cte on cte.EMPID = t.MRGID ) select EMPID , EMPNAME , EMPDESIG , MRGID , LEVEL , PATH , HIERARCHY = replicate(' ', LEVEL) + EMPDESIG from cte order by PATH; The same but with the provided data samples: declare #EMPMASTER table ( EMPID CHAR(10) , EMPNAME NVARCHAR(50) , EMPDESIG VARCHAR(20) , MRGID CHAR(10) ); insert into #EMPMASTER values ('1' , 'RAM' , 'CEO' , '0' ), ('7326' , 'MOHD RAFI' , 'MANAGER' , '7454' ), ('7454' , 'PMT PHARMA' , 'MANAGER' , '1' ), ('2094' , 'VAC SANJAY' , 'DEVELOPER' , '14005' ), ('602' , 'GS' , 'MANAGER' , '7454' ), ('412' , 'RAJESH' , 'LEAD' , '602' ), ('14005' , 'VAC SM N' , 'LEAD' , '7326' ), ('34395' , 'DEEPAK' , 'LEAD' , '7326' ), ('16430' , 'VIJAY' , 'DEVELOPER' , '34395' ); with cte as ( select EMPID , EMPNAME , EMPDESIG , MRGID , LEVEL = 0, PATH = cast(EMPDESIG + ' (' + EMPNAME +')' as varchar(8000)) from #EMPMASTER where MRGID = '0' UNION ALL select t.EMPID , t.EMPNAME , t.EMPDESIG , t.MRGID , LEVEL = cte.LEVEL + 1, PATH = cast(cte.PATH + ' > ' + t.EMPDESIG + ' (' + t.EMPNAME +')' as varchar(8000)) from #EMPMASTER t inner join cte on cte.EMPID = t.MRGID ) select EMPID , EMPNAME , EMPDESIG , MRGID , LEVEL , PATH , HIERARCHY = replicate(' ', LEVEL) + EMPDESIG + ' (' + EMPNAME +')' from cte order by PATH;
Return one role per ID
I want to return only one role per employee(EmpID), that being the last employee to work on a specific task(FixEndDate). Below are mockup tables. DECLARE #Problem TABLE ( ProblemID INT , ProblemDate DATETIME , LogBy NVARCHAR(50) ) INSERT INTO #Problem(ProblemID,ProblemDate,LogBy) VALUES (1,CAST('2015-01-29 10:53:46.000'AS DATETIME),'Carl') , (2,CAST('2015-01-21 10:53:46.000'AS DATETIME),'Paul') , (3,CAST('2015-01-21 13:53:46.000'AS DATETIME),'Paul') , (4,CAST('2015-01-21 15:53:46.000'AS DATETIME),'Paul') DECLARE #Fix TABLE ( FixID INT , ProblemID INT , EmpID INT , FixStartDate DATETIME , FixEndDate DATETIME ) INSERT INTO #Fix(ProblemID, EmpID, FixStartDate, FixEndDate) VALUES (1, 12, CAST('2015-02-02 10:53:46.000'AS DATETIME),CAST('2015-02-02 12:50:46.000'AS DATETIME)) , (1, 14, CAST('2015-02-03 10:53:46.000'AS DATETIME),CAST('2015-02-03 12:50:46.000'AS DATETIME)) , (2, 11, CAST('2015-02-04 10:53:46.000'AS DATETIME),CAST('2015-02-04 01:55:46.000'AS DATETIME)) , (2, 12, CAST('2015-02-04 05:56:46.000'AS DATETIME),CAST('2015-02-03 08:50:46.000'AS DATETIME)) , (3, 10, CAST('2015-02-04 07:53:46.000'AS DATETIME),CAST('2015-02-04 18:10:46.000'AS DATETIME)) , (3, 15, CAST('2015-02-05 10:53:46.000'AS DATETIME),CAST('2015-02-05 12:10:46.000'AS DATETIME)) , (3, 18, CAST('2015-02-05 11:53:46.000'AS DATETIME),CAST('2015-02-05 01:10:46.000'AS DATETIME)) , (4, 20, CAST('2015-02-07 12:53:46.000'AS DATETIME),CAST('2015-02-08 03:10:46.000'AS DATETIME)) , (4, 23, CAST('2015-02-08 11:53:46.000'AS DATETIME),CAST('2015-02-09 18:10:46.000'AS DATETIME)) , (4, 13, CAST('2015-02-10 16:53:46.000'AS DATETIME),CAST('2015-02-11 16:10:46.000'AS DATETIME)) I tried with: SELECT f.EmpID , p.ProblemID , p.ProblemDate , f.FixStartDate , f.FixEndDate FROM #Problem AS p INNER JOIN #Fix AS f ON p.ProblemID = f.ProblemID INNER JOIN ( SELECT f.EmpID , p.ProblemID , p.ProblemDate , f.FixStartDate , MAX(f.FixEndDate) AS Fixed FROM #Problem AS p INNER JOIN #Fix AS f ON p.ProblemID = f.ProblemID GROUP BY f.EmpID , p.ProblemID , p.ProblemDate , f.FixStartDate ) AS d ON d.EmpID = f.EmpID AND d.Fixed = f.FixEndDate ORDER BY FixEndDate DESC Which is the way forward with this?
try SELECT f.EmpID , p.ProblemID , p.ProblemDate , f.FixStartDate , f.FixEndDate FROM #Problem AS p INNER JOIN (select * from (select * ,row_number() over (partition by ProblemID order by fixenddate desc) as rno from #Fix) t where rno=1) AS f ON p.ProblemID = f.ProblemID
Strange behavior in SQL query
Good evening to all, as the subject, I have a query in which parameters can be used, preceded by the # character, in order to do the calculations. In order to test this query using MySQL Front. The problem is that if you launch the query the first time, I expected returns data, but if you run it again, I do not return anything. I also tried using Toad, but from the first attempt did not return anything. Thank you in advance. SELECT( SUM( PzProd1 + PzProd2 + PzProd3 + PzProd4 + PzProd5 + PzProd6 )) AS Pezzi_Prodotti, PSLC.PSLC_Prod.LineaID as linea, PSLC.PSLC_Prod.SezioneID, PSLC.PSLC_Prod.Desc_Prod, #cod_spezz := PSLC.PSLC_Prod.cod_spezz_1, #l_spezz := REPLACE(FORMAT((SUBSTRING_INDEX( PSLC.PSLC_Prod.lung_Spezz_1, '± ', 1) / 1000) ,2) , ',' , '.' ) as lunghezza_Spezzone, REPLACE(FORMAT( #MtScrap := SUM(MtScrap) , 0) , ',' , '.') as MtScarto, REPLACE(FORMAT((#MtScrap / #l_spezz),0), ',' , '.') as ScartoInPezzi , REPLACE(FORMAT(SUM((PzProd1 + PzProd2 + PzProd3 + PzProd4 + PzProd5 + PzProd6) * #l_spezz) ,0), ',' , '.') as MT_Prodotti, REPLACE(FORMAT( #xxx := ( SUM(IF(PSLC.PSLC_CAUSALI.AvailableCausa_1 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.AvailableTotTime_1 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.AvailableCausa_2 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.AvailableTotTime_2 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.AvailableCausa_3 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.AvailableTotTime_3 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.AvailableCausa_4 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.AvailableTotTime_4 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.AvailableCausa_5 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.AvailableTotTime_5 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.AvailableCausa_6 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.AvailableTotTime_6 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.Causa_1 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.Total_Time_1 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.Causa_2 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.Total_Time_2 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.Causa_3 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.Total_Time_3 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.Causa_4 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.Total_Time_4 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.Causa_5 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.Total_Time_5 , 0)) + SUM(IF(PSLC.PSLC_CAUSALI.Causa_6 NOT LIKE ('%sezione%'),PSLC.PSLC_CAUSALI.Total_Time_6 , 0))),0), ',' , '.') as tempi, #a := SAMPLE.products.vel_linea as Vel, REPLACE(FORMAT(((#xxx * #a) / #l_spezz) ,0), ',' , '.') as MinFermoInPezzi FROM PSLC.PSLC_Prod JOIN PSLC.PSLC_CAUSALI ON ( (PSLC.PSLC_Prod.SezioneID = PSLC.PSLC_CAUSALI.IDSezione) and (PSLC.PSLC_prod.giorno = PSLC.PSLC_CAUSALI.DataStartPrg) AND ( (PSLC.PSLC_prod.Cod_Spezz_1 = PSLC.PSLC_CAUSALI.IDSpezzone) OR (PSLC.PSLC_prod.Cod_Spezz_2 = PSLC.PSLC_causali.IDSpezzone) OR (PSLC.PSLC_prod.Cod_Spezz_3 = PSLC.PSLC_causali.IDSpezzone) OR (PSLC.PSLC_prod.Cod_Spezz_4 = PSLC.PSLC_CAUSALI.IDSpezzone) OR (PSLC.PSLC_prod.Cod_Spezz_5 = PSLC.PSLC_causali.IDSpezzone) OR (PSLC.PSLC_prod.Cod_Spezz_6 = PSLC.PSLC_causali.IDSpezzone) ) AND PSLC.PSLC_prod.ID_Prog = PSLC.PSLC_CAUSALI.ID_Prog) JOIN sample.products ON ( PSLC.PSLC_Prod.SezioneID = sample.products.sku) WHERE (PSLC.PSLC_Prod.giorno BETWEEN '2014-05-05' AND '2014-05-09') AND (PSLC.PSLC_Prod.SezioneID = PSLC.PSLC_CAUSALI.IDSezione) AND ( ((PSLC.PSLC_prod.Cod_Spezz_1 = #cod_spezz) OR (PSLC.PSLC_prod.Cod_Spezz_2 = #cod_spezz) OR (PSLC.PSLC_prod.Cod_Spezz_3 = #cod_spezz) OR (PSLC.PSLC_prod.Cod_Spezz_4 = #cod_spezz) OR (PSLC.PSLC_prod.Cod_Spezz_5 = #cod_spezz) OR (PSLC.PSLC_prod.Cod_Spezz_6 = #cod_spezz)) )