You are on page 1of 50

USE [csdp491a]

GO
/****** Object: StoredProcedure [mart].[usp_update_fact_finance] Script Date:
07/04/2017 13:42:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROC [mart].[usp_update_fact_finance]


(
@db_load_job_log_id INT
,@staging_db_name VARCHAR(50)
,@task_name VARCHAR(100)
,@package_name VARCHAR(100)
,@gbu_sk INT
,@month_num INT
,@scenario_sk INT
,@system_type_sk INT
,@result INT OUTPUT
)
/
***********************************************************************************
****************************************************************
* Name : [usp_update_fact_finance]
* Purpose : This proc should be called after [mart].[fact_finance_work]
has been populated with new data.
* This involves disabling existing columnstore index on
the table , uploading the data and rebuilding the columnstore index.
*
* Input Params :
* @db_load_job_log_id : Load job log id
identifying the job from which this procedure was called.
* @staging_db_name : Name of Staging
Database, for logging purposes.
* @month_num : The month for which the
fact data was loaded.
* @gbu_sk : The GBU for which the
fact data was loaded.
* @task_name : Parent task name
* @package_name : Parent package
name
*
* Output Params : @result : 0 for failure and
1 for success.
*
* Versions : No Author Date
Comments
* : -- ------ ----
--------
* : 0 Thass\Amit.Kar 18-Nov-2013
Original version.
* : 1 Thass\Rishi.Gupta 17-Jun-2014
Updated to add Sales sub area
* : 2 Thass\Rishi.Gupta 26-Sep-2014
Updated to include Distribution Channel
* : 3 Thass\Kanishka.Verma 01-Jun-2015
Updated to include System Type
* : 4 Thass\Sidharth.Sundar 20-Jan-2016
Changed destination to [mart].[fact_finance_queue] and all related changes
***********************************************************************************
******************************************************************/
AS
BEGIN

-- Check parameter information and provide details on the procedure if it is being


called from the command line.
IF (@db_load_job_log_id IS NULL OR @staging_db_name IS NULL OR @month_num IS NULL
OR @gbu_sk IS NULL OR @system_type_sk IS NULL)
BEGIN
RAISERROR('ERROR - One of the mandatory parameters is NULL.', 16, 1)
PRINT ''
PRINT 'Execution:'
PRINT '---------'
PRINT 'This procedure has 4 input parameters which are mandatory. The
procedure should be executed as follows:'
PRINT ''
PRINT 'EXECUTE [usp_update_fact_finance]'
PRINT ' @db_load_job_log_id -- INT <Mandatory> The
identifier from [interm].[db_load_job] against which all logging has to be done.'
PRINT ' @staging_db_name -- VARCHAR(100) <Mandatory> The
Name of Staging Database, for logging purposes.'
PRINT ' @month_num -- INT
<Mandatory> The month for which the fact data was loaded.'
PRINT ' @gbu_sk -- SMALLINT
<Mandatory> The GBU for which the fact data was loaded.'
PRINT ' @system_type_sk -- SMALLINT <Mandatory>
The System Type for which the fact data was loaded.'
PRINT ''
RETURN 0
END

DECLARE @target_partition_range_value BIGINT;


DECLARE @next_partition_range_value BIGINT;
DECLARE @prev_partition_range_value BIGINT;
DECLARE @partition_function_name VARCHAR(100);
DECLARE @partition_scheme_name VARCHAR(100);
DECLARE @sql_cmd NVARCHAR(MAX);
DECLARE @partition_number INT;
DECLARE @count_rows as BIGINT;
DECLARE @record_count INT
DECLARE @step_nbr SMALLINT -- Identifies the
step in the stored procedure.
DECLARE @msg VARCHAR(2000) -- The message
that is logged.
DECLARE @exception_msg VARCHAR(2000) -- The exception
message logged in the Exceptions table.
DECLARE @err_desc VARCHAR(1000) -- The system
generated error message which is logged.
DECLARE @stored_proc_name VARCHAR(50) -- The name of the
stored procedure.
DECLARE @err_code INT -- The system
generated error number which is logged.
DECLARE @err_state INT -- The
system generated error state which is logged.
DECLARE @err_code_default INT -- Default Error
Severity = 16 used to raise errors.
DECLARE @success INT -- Status ID for
Success
DECLARE @failure INT -- Status ID for
Failure
DECLARE @sql NVARCHAR(2000) -- Variable
to hold SQL queries to be executed on the Staging Database.

BEGIN TRY
--get the target partition range value based on gbu_sk and month_num
SET @target_partition_range_value = (CONVERT([bigint],CONVERT([varchar]
(20),@system_type_sk)+CONVERT([varchar](20),@scenario_sk)+CONVERT([varchar]
(20),@month_num)+CONVERT([varchar](20),@gbu_sk)));

SET @sql = 'SELECT @partition_function_name = [setting_value] FROM [' +


@staging_db_name + '].[interim].[db_settings] WHERE [setting_key] =
''Partition_Function_Queue'''
EXEC sp_executesql @sql , N'@partition_function_name VARCHAR(100) OUTPUT',
@partition_function_name = @partition_function_name OUTPUT

SET @sql = 'SELECT @partition_scheme_name = [setting_value] FROM [' +


@staging_db_name + '].[interim].[db_settings] WHERE [setting_key] =
''Partition_Scheme_Queue'''
EXEC sp_executesql @sql , N'@partition_scheme_name VARCHAR(100) OUTPUT',
@partition_scheme_name = @partition_scheme_name OUTPUT

SET @record_count = 0
SET @msg = ''
SET @err_code_default = 16
SET @err_desc = NULL
SET @stored_proc_name = OBJECT_NAME(@@PROCID)
SET @step_nbr = 0

SET @msg = 'Executing the procedure for Target partition range value : ' +
CAST(ISNULL(@target_partition_range_value,'NULL') AS VARCHAR(20))
SET @step_nbr = @step_nbr + 1

--/****Log details into db_load_detail_log table****/


SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].[usp_write_log]
@db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id INT


,@package_name
VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_proc_name
VARCHAR(100)
,@step_nbr
SMALLINT
,@record_count INT
,@msg
VARCHAR(1000)'
,@db_load_job_log_id =
@db_load_job_log_id
,@package_name =
@package_name
,@task_name =
@task_name
,@stored_proc_name =
@stored_proc_name
,@step_nbr =
@step_nbr
,@record_count =
@record_count
,@msg = @msg

--Get the Load Status ID for Successs


SET @msg = 'Getting the Load Status ID for Success'

SET @step_nbr = @step_nbr + 1

SET @sql = 'SELECT @success=[db_load_status_id] FROM [' + @staging_db_name +


'].[interim].[db_status] WHERE [Load_status_desc]=''Success'''

EXEC sp_executesql @sql,N'@success INT OUTPUT',@success = @success OUTPUT

SET @record_count= @@ROWCOUNT

/****Log details into db_load_detail_log table****/

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].[usp_write_log]


@db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id INT


,@package_name
VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_proc_name
VARCHAR(100)
,@step_nbr
SMALLINT
,@record_count INT
,@msg
VARCHAR(1000)'
,@db_load_job_log_id =
@db_load_job_log_id
,@package_name =
@package_name
,@task_name =
@task_name
,@stored_proc_name =
@stored_proc_name
,@step_nbr =
@step_nbr
,@record_count =
@record_count
,@msg = @msg

--Get the Load Status ID for Failure


SET @msg = 'Getting the Load Status ID for Failure'

SET @step_nbr = @step_nbr + 1

SET @sql = N'SELECT @failure=[db_load_status_id] FROM [' + @staging_db_name +


'].[interim].[db_status] WHERE [Load_status_desc]=''Failure'''

EXEC sp_executesql @sql,N'@failure INT OUTPUT',@failure = @failure OUTPUT

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].[usp_write_log]


@db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id INT


,@package_name
VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_proc_name
VARCHAR(100)
,@step_nbr
SMALLINT
,@record_count
INT
,@msg
VARCHAR(1000)'
,@db_load_job_log_id =
@db_load_job_log_id
,@package_name
= @package_name
,@task_name
= @task_name
,@stored_proc_name
= @stored_proc_name
,@step_nbr
= @step_nbr
,@record_count
= @record_count
,@msg
= @msg

--BEGIN TRANSACTION
--check if target partition range already exists
SET @msg = 'Checking if target partition range already exists'
SET @step_nbr = @step_nbr + 1

SELECT * FROM sys.partition_range_values prv


INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
AND pf.name = @partition_function_name
AND prv.value = @target_partition_range_value

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].


[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id INT


,@package_name
VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_proc_name
VARCHAR(100)
,@step_nbr
SMALLINT
,@record_count
INT
,@msg
VARCHAR(1000)'
,@db_load_job_log_id
= @db_load_job_log_id
,@package_name
= @package_name
,@task_name
= @task_name
,@stored_proc_name
= @stored_proc_name
,@step_nbr
= @step_nbr
,@record_count
= @record_count
,@msg
= @msg

--if target partition range does not exist


IF @record_count = 0
BEGIN

--find the partition number where new data will go


SET @msg = 'Finding the Partition Number where new data
will go'

SET @step_nbr = @step_nbr + 1

SET @sql_cmd = N'SELECT @partnum=$PARTITION.' +


@partition_function_name + '('+ cast(@target_partition_range_value as nvarchar(50))
+ ')';

EXECUTE sp_executesql @sql_cmd, N'@partnum int OUTPUT',


@partnum=@partition_number OUTPUT

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].


[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name =
@package_name

, @task_name = @task_name

, @stored_proc_name =
@stored_proc_name
, @step_nbr = @step_nbr

, @record_count =
@record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id INT


,@package_name
VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_proc_name
VARCHAR(100)
,@step_nbr
SMALLINT
,@record_count
INT
,@msg
VARCHAR(1000)'
,@db_load_job_log_
id = @db_load_job_log_id
,@package_name
= @package_name
,@task_name
= @task_name
,@stored_proc_name
= @stored_proc_name
,@step_nbr
= @step_nbr
,@record_count
= @record_count
,@msg
= @msg

--Check if the partition is nonempty


SET @msg = 'Checking if the Partition is nonempty'
SET @step_nbr = @step_nbr + 1

SET @sql_cmd = N'SELECT @cnt=count(*) from [mart].


[fact_finance_queue] WHERE $PARTITION.' + @partition_function_name +
'(partition_col)=' + CAST(@partition_number AS VARCHAR(10));

EXECUTE sp_executesql @sql_cmd, N'@cnt int OUTPUT',


@cnt=@count_rows OUTPUT

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].


[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name
, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id


INT
,@package_na
me VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_pro
c_name VARCHAR(100)
,@step_nbr
SMALLINT
,@record_cou
nt INT
,@msg
VARCHAR(1000)'
,@db_load_jo
b_log_id = @db_load_job_log_id
,@package_na
me = @package_name
,@task_name
= @task_name
,@stored_pro
c_name = @stored_proc_name
,@step_nbr
= @step_nbr
,@record_cou
nt = @record_count
,@msg
= @msg

--If non-empty
IF @count_rows > 0
BEGIN
--swap partition out
IF NOT EXISTS (select * from sys.sysindexes
where name = 'csidx_fact_finance_archive')
BEGIN
SET @msg = 'Creating Index on Fact
Finance Archive'
SET @step_nbr = @step_nbr + 1

CREATE NONCLUSTERED COLUMNSTORE


INDEX [csidx_fact_finance_archive] ON [mart].[fact_finance_archive]
(

[primary_sold_to_group_sk],
[sold_to_group_sk],
[gtm_sku_sk],
[sku_region_sk],

[distribution_channel_sk],
[sales_sub_area_sk],
[month_num],
[gbu_sk],
[date_comparison_sk],
[scenario_sk],
[conversion_sk],
[measure_sk],
[currency_sk],
[channel_sub_format_sk],
[system_type_sk],
[partition_col],
[value]
) ON [FG_MART_FACT_DATA]

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name
= @package_name

, @task_name
= @task_name

, @stored_proc_name =
@stored_proc_name

, @step_nbr
= @step_nbr

, @record_count
= @record_count

, @message_type_key
= ''C''

, @log_message
= @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT
,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END

SET @msg = 'Moving the data from [mart].


[fact_finance_queue] to [mart].[fact_finance_archive]'
SET @step_nbr = @step_nbr + 1

ALTER TABLE [mart].[fact_finance_queue] SWITCH


PARTITION @partition_number TO [mart].[fact_finance_archive] ;

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name +


'].[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT
,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

--set filegroup for next use

SET @msg = 'Setting Filegroup for Next use'


SET @step_nbr = @step_nbr + 1

SET @sql_cmd=N'ALTER PARTITION SCHEME '+


@partition_scheme_name +' NEXT USED [FG_MART_FACT_DATA];';

EXECUTE sp_executesql @sql_cmd

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name +


'].[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT
,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

--add new boundary to main table


SET @msg = 'Adding new boundary to main table'
SET @step_nbr = @step_nbr + 1

SET @sql_cmd=N'ALTER PARTITION FUNCTION '+


@partition_function_name +'() SPLIT RANGE ('+CAST(@target_partition_range_value as
VARCHAR(20))+');';

EXECUTE sp_executesql @sql_cmd

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name +


'].[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT
,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

--Swap the data back into main table from


archive table
--create check constraints
--get range value for the prev boundary
SET @msg = 'Getting range value for
the previous boundary'
SET @step_nbr = @step_nbr + 1

SELECT @prev_partition_range_value
= CAST(prv.value AS BIGINT)
FROM sys.partition_range_values
prv
JOIN sys.partition_functions pf
ON pf.function_id =
prv.function_id
WHERE pf.name =
@partition_function_name
AND prv.boundary_id = (
SELECT prv.boundary_id
FROM sys.partition_range_values
prv
JOIN sys.partition_functions pf
ON pf.function_id =
prv.function_id
WHERE pf.name =
@partition_function_name
AND prv.value =
@target_partition_range_value) -1

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name
, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

--drop and recreate check constraint on


source table based on the new ranges

IF
OBJECT_ID('mart.ck_newpartition_archive', 'C') IS NOT NULL
BEGIN

SET @msg = 'Drop check


constraint on Source table based on the new ranges 1'
SET @step_nbr = @step_nbr + 1
ALTER TABLE [mart].
[fact_finance_archive] DROP CONSTRAINT ck_newpartition_archive

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name =
@package_name

, @task_name =
@task_name

, @stored_proc_name =
@stored_proc_name

, @step_nbr =
@step_nbr

, @record_count =
@record_count

, @message_type_key =
''C''

, @log_message =
@msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg
END

IF
@target_partition_range_value IS NOT NULL and @prev_partition_range_value IS NOT
NULL
BEGIN

SET @msg =
'Recreate check constraint on Source table based on the new ranges 1'
SET @step_nbr =
@step_nbr + 1

SET @sql_cmd =
N'ALTER TABLE [mart].[fact_finance_archive] WITH NOCHECK ADD CONSTRAINT
cK_newpartition_archive CHECK (partition_col >= ' +
CAST(@prev_partition_range_value as varchar(50))+' and partition_col <
'+CAST(@target_partition_range_value as varchar(50))+');'

+N'ALTER TABLE [mart].[fact_finance_archive] WITH CHECK CHECK CONSTRAINT


cK_newpartition_archive;';

EXECUTE
sp_executesql @sql_cmd

SET @sql =
N'EXECUTE [' + @staging_db_name + '].[interim].[usp_write_log]
@db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql
@sql, N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)
,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

--swap the archive


data back to the main table so that it goes into the partition created after the
split

SET @msg = 'Swap


the archive data back to the main table so that it goes into the partition created
after the split'
SET @step_nbr =
@step_nbr + 1

ALTER TABLE
[mart].[fact_finance_archive] SWITCH TO [mart].[fact_finance_queue] PARTITION
@partition_number;

SET @record_count=
@@ROWCOUNT

SET @sql =
N'EXECUTE [' + @staging_db_name + '].[interim].[usp_write_log]
@db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr
, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql
@sql, N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END

--drop the check constraint

IF
OBJECT_ID('mart.ck_newpartition_archive', 'C') IS NOT NULL
BEGIN

SET @msg = 'Drop the


Check Constraint'
SET @step_nbr =
@step_nbr + 1

ALTER TABLE [mart].


[fact_finance_archive] DROP CONSTRAINT cK_newpartition_archive

SET @record_count=
@@ROWCOUNT

SET @sql = N'EXECUTE ['


+ @staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name =
@package_name

, @task_name =
@task_name

, @stored_proc_name =
@stored_proc_name

, @step_nbr =
@step_nbr

, @record_count =
@record_count

, @message_type_key =
''C''

, @log_message =
@msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END
--find the new partition number in the
main table where the new data will go

SET @msg = 'Find the new partition


number in the main table where the new data will go'
SET @step_nbr = @step_nbr + 1

SET @sql_cmd = N'SELECT


@partnum=$PARTITION.' + @partition_function_name + '('+
cast(@target_partition_range_value as nvarchar(50)) + ')';

EXECUTE sp_executesql @sql_cmd,


N'@partnum int OUTPUT', @partnum=@partition_number OUTPUT

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name
,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END
ELSE --if the partition number does not have any data
BEGIN
--set filegroup for next use

SET @msg = 'Set Filegroup for next use'


SET @step_nbr = @step_nbr + 1

SET @sql_cmd=N'ALTER PARTITION SCHEME '+


@partition_scheme_name +' NEXT USED [FG_MART_FACT_DATA];';
EXECUTE sp_executesql @sql_cmd

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id
,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

--add new boundary


SET @msg = 'Add new boundary'
SET @step_nbr = @step_nbr + 1

SET @sql_cmd=N'ALTER PARTITION FUNCTION '+


@partition_function_name +'() SPLIT RANGE ('+CAST(@target_partition_range_value as
VARCHAR(20))+');';

EXECUTE sp_executesql @sql_cmd

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'
,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

--find the new partition number where the new


data will go

SET @msg = 'Find the new Partition Number where


the new data will go'
SET @step_nbr = @step_nbr + 1

SET @sql_cmd = N'SELECT @partnum=$PARTITION.' +


@partition_function_name + '('+ cast(@target_partition_range_value as nvarchar(50))
+ ')';

EXECUTE sp_executesql @sql_cmd, N'@partnum int


OUTPUT', @partnum=@partition_number OUTPUT

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name +


'].[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)
,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END

--get range value for the next boundary.

SET @msg = 'Get range value for the next boundary.'


SET @step_nbr = @step_nbr + 1

SELECT @next_partition_range_value = CAST(prv.value


AS BIGINT)
FROM sys.partition_range_values prv
JOIN sys.partition_functions pf
ON pf.function_id = prv.function_id
WHERE pf.name = @partition_function_name
AND prv.boundary_id = (
SELECT prv.boundary_id
FROM sys.partition_range_values prv
JOIN sys.partition_functions pf
ON pf.function_id = prv.function_id
WHERE pf.name = @partition_function_name
AND prv.value = @target_partition_range_value) + 1

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name +


'].[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count
, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT
,@pack
age_name VARCHAR(100)
,@task
_name VARCHAR(100)
,@stor
ed_proc_name VARCHAR(100)
,@step
_nbr SMALLINT
,@reco
rd_count INT
,@msg
VARCHAR(1000)'
,@db_l
oad_job_log_id = @db_load_job_log_id
,@pack
age_name = @package_name
,@task
_name = @task_name
,@stor
ed_proc_name = @stored_proc_name
,@step
_nbr = @step_nbr
,@reco
rd_count = @record_count
,@msg
= @msg

--drop and recreate check constraint on source table


based on the new ranges

IF OBJECT_ID('mart.ck_newpartition', 'C') IS NOT NULL


BEGIN

SET @msg = 'Drop the check constraint on Fact


Finance Work table'
SET @step_nbr = @step_nbr + 1

ALTER TABLE [mart].[fact_finance_work] DROP


CONSTRAINT ck_newpartition

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].


[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name
, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END

IF @target_partition_range_value IS NOT NULL and


@next_partition_range_value IS NOT NULL
BEGIN

SET @msg = 'Recreate the check constraint


on Fact Finance Work table'
SET @step_nbr = @step_nbr + 1

SET @sql_cmd = N'ALTER TABLE [mart].


[fact_finance_work] WITH NOCHECK ADD CONSTRAINT ck_newpartition CHECK
(partition_col >= ' + CAST(@target_partition_range_value as varchar(50))+' and
partition_col < '+CAST(@next_partition_range_value as varchar(50))+');'
+N'ALTER TABLE
[mart].[fact_finance_work] WITH CHECK CHECK CONSTRAINT ck_newpartition;';

EXECUTE sp_executesql @sql_cmd


SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

SET @msg = 'Switching data from [mart].


[fact_finance_work] to [mart].[fact_finance_queue]'
SET @step_nbr = @step_nbr + 1

ALTER TABLE [mart].[fact_finance_work]


SWITCH TO [mart].[fact_finance_queue] PARTITION @partition_number;

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END

ELSE IF @next_partition_range_value IS NULL


BEGIN
SET @msg = 'Recreate the check constraint
on Fact Finance Work table'
SET @step_nbr = @step_nbr + 1

SET @sql_cmd = N'ALTER TABLE [mart].


[fact_finance_work] WITH NOCHECK ADD CONSTRAINT ck_newpartition CHECK
(partition_col >= ' + CAST(@target_partition_range_value as varchar(50))+');'
+N'ALTER TABLE
[mart].[fact_finance_work] WITH CHECK CHECK CONSTRAINT ck_newpartition;';

EXECUTE sp_executesql @sql_cmd

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count
,@msg = @msg

SET @msg = 'Switch data from [mart].


[fact_finance_work] to [mart].[fact_finance]'
SET @step_nbr = @step_nbr + 1

ALTER TABLE [mart].[fact_finance_work]


SWITCH TO [mart].[fact_finance_queue] PARTITION @partition_number;

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name


+ '].[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count
,@msg = @msg

END

--drop the check constraint

IF OBJECT_ID('mart.ck_newpartition', 'C') IS NOT NULL

BEGIN

SET @msg = 'Drop the check constraint'


SET @step_nbr = @step_nbr + 1

ALTER TABLE [mart].[fact_finance_work] DROP


CONSTRAINT ck_newpartition

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name +


'].[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT
,@pack
age_name VARCHAR(100)
,@task
_name VARCHAR(100)
,@stor
ed_proc_name VARCHAR(100)
,@step
_nbr SMALLINT
,@reco
rd_count INT
,@msg
VARCHAR(1000)'
,@db_l
oad_job_log_id = @db_load_job_log_id
,@pack
age_name = @package_name
,@task
_name = @task_name
,@stor
ed_proc_name = @stored_proc_name
,@step
_nbr = @step_nbr
,@reco
rd_count = @record_count
,@msg
= @msg
END

END

ELSE
BEGIN
--find the partition number from where to drop data from
SET @msg = 'Find the partition number from where to drop
data from'
SET @step_nbr = @step_nbr + 1

SET @sql_cmd = N'SELECT @partnum=$PARTITION.' +


@partition_function_name + '('+ cast(@target_partition_range_value as nvarchar(50))
+ ')';

EXECUTE sp_executesql @sql_cmd, N'@partnum int OUTPUT',


@partnum=@partition_number OUTPUT

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].


[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT
,@pack
age_name VARCHAR(100)
,@task
_name VARCHAR(100)
,@stor
ed_proc_name VARCHAR(100)
,@step
_nbr SMALLINT
,@reco
rd_count INT
,@msg
VARCHAR(1000)'
,@db_l
oad_job_log_id = @db_load_job_log_id
,@pack
age_name = @package_name
,@task
_name = @task_name
,@stor
ed_proc_name = @stored_proc_name
,@step
_nbr = @step_nbr
,@reco
rd_count = @record_count
,@msg
= @msg

IF EXISTS (SELECT 1 FROM [mart].[fact_finance_archive])


BEGIN

IF EXISTS (select * from sys.sysindexes where name =


'csidx_fact_finance_archive')
BEGIN

SET @msg = 'Drop index on Fact Finance


Archive tablw'
SET @step_nbr = @step_nbr + 1

DROP INDEX [csidx_fact_finance_archive]


ON [mart].[fact_finance_archive];

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name =
@package_name

, @task_name = @task_name

, @stored_proc_name =
@stored_proc_name

, @step_nbr = @step_nbr

, @record_count =
@record_count

, @message_type_key = ''C''

, @log_message = @msg'
EXEC sp_executesql @sql,
N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END

SET @msg = 'Truncate table Fact Finance


Archive'
SET @step_nbr = @step_nbr + 1

TRUNCATE TABLE [mart].[fact_finance_archive];

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name +


'].[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'
EXEC sp_executesql @sql,
N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END

--create columstore index on the archive table

IF NOT EXISTS (select * from sys.sysindexes where name =


'csidx_fact_finance_archive')
BEGIN

SET @msg = 'Create Columstore index on the


Archive table'
SET @step_nbr = @step_nbr + 1

CREATE NONCLUSTERED COLUMNSTORE INDEX


[csidx_fact_finance_archive] ON [mart].[fact_finance_archive]
(
[primary_sold_to_group_sk],
[sold_to_group_sk],
[gtm_sku_sk],
[sku_region_sk],
[distribution_channel_sk],
[month_num],
[sales_sub_area_sk],
[gbu_sk],
[date_comparison_sk],
[scenario_sk],
[conversion_sk],
[measure_sk],
[currency_sk],
[channel_sub_format_sk],
[system_type_sk],
[partition_col],
[value]
) ON [FG_MART_FACT_DATA]

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].


[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id


INT
,@package_na
me VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_pro
c_name VARCHAR(100)
,@step_nbr
SMALLINT
,@record_cou
nt INT
,@msg
VARCHAR(1000)'
,@db_load_jo
b_log_id = @db_load_job_log_id
,@package_na
me = @package_name
,@task_name
= @task_name
,@stored_pro
c_name = @stored_proc_name
,@step_nbr
= @step_nbr
,@record_cou
nt = @record_count
,@msg
= @msg

END
--delete existing data
SET @msg = 'Switching data from [mart].[fact_finance_queue]
to [mart].[fact_finance_archive]'
SET @step_nbr = @step_nbr + 1

ALTER TABLE [mart].[fact_finance_queue] SWITCH PARTITION


@partition_number TO [mart].[fact_finance_archive] ;

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].


[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id


INT
,@package_na
me VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_pro
c_name VARCHAR(100)
,@step_nbr
SMALLINT
,@record_cou
nt INT
,@msg
VARCHAR(1000)'
,@db_load_jo
b_log_id = @db_load_job_log_id
,@package_na
me = @package_name
,@task_name
= @task_name
,@stored_pro
c_name = @stored_proc_name
,@step_nbr
= @step_nbr
,@record_cou
nt = @record_count
,@msg
= @msg

SET @msg = 'Drop index on Fact Finance Archive table'


SET @step_nbr = @step_nbr + 1

DROP INDEX [csidx_fact_finance_archive] ON [mart].


[fact_finance_archive];

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].


[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id


INT
,@package_na
me VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_pro
c_name VARCHAR(100)
,@step_nbr
SMALLINT
,@record_cou
nt INT
,@msg
VARCHAR(1000)'
,@db_load_jo
b_log_id = @db_load_job_log_id
,@package_na
me = @package_name
,@task_name
= @task_name
,@stored_pro
c_name = @stored_proc_name
,@step_nbr
= @step_nbr
,@record_cou
nt = @record_count
,@msg
= @msg

SET @msg = 'Truncate Fact Finance Archive table'


SET @step_nbr = @step_nbr + 1

TRUNCATE TABLE [mart].[fact_finance_archive];


SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].


[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id


INT
,@package_na
me VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_pro
c_name VARCHAR(100)
,@step_nbr
SMALLINT
,@record_cou
nt INT
,@msg
VARCHAR(1000)'
,@db_load_jo
b_log_id = @db_load_job_log_id
,@package_na
me = @package_name
,@task_name
= @task_name
,@stored_pro
c_name = @stored_proc_name
,@step_nbr
= @step_nbr
,@record_cou
nt = @record_count
,@msg
= @msg

--Add new data in


--get range value for the next boundary.

SET @msg = 'Get range value for the next boundary'


SET @step_nbr = @step_nbr + 1

SELECT @next_partition_range_value = CAST(prv.value AS


BIGINT)
FROM sys.partition_range_values prv
JOIN sys.partition_functions pf
ON pf.function_id = prv.function_id
WHERE pf.name = @partition_function_name
AND prv.boundary_id = (
SELECT prv.boundary_id
FROM sys.partition_range_values prv
JOIN sys.partition_functions pf
ON pf.function_id = prv.function_id
WHERE pf.name = @partition_function_name
AND prv.value = @target_partition_range_value) + 1

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].


[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql, N'@db_load_job_log_id


INT
,@package_na
me VARCHAR(100)
,@task_name
VARCHAR(100)
,@stored_pro
c_name VARCHAR(100)
,@step_nbr
SMALLINT
,@record_cou
nt INT
,@msg
VARCHAR(1000)'
,@db_load_jo
b_log_id = @db_load_job_log_id
,@package_na
me = @package_name
,@task_name
= @task_name
,@stored_pro
c_name = @stored_proc_name
,@step_nbr
= @step_nbr
,@record_cou
nt = @record_count
,@msg
= @msg

--drop and recreate check constraint on source table based


on the new ranges

IF OBJECT_ID('mart.cK_newpartition', 'C') IS NOT NULL


BEGIN

SET @msg = 'Drop check constraint on


source table based on the new ranges'
SET @step_nbr = @step_nbr + 1

ALTER TABLE [mart].[fact_finance_work]


DROP CONSTRAINT ck_newpartition

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name
,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END

IF @target_partition_range_value IS NOT NULL and


@next_partition_range_value IS NOT NULL
BEGIN

SET @msg = 'Recreate check constraint on


source table based on the new ranges'
SET @step_nbr = @step_nbr + 1

SET @sql_cmd = N'ALTER TABLE [mart].


[fact_finance_work] WITH NOCHECK ADD CONSTRAINT ck_newpartition CHECK
(partition_col >= ' + CAST(@target_partition_range_value as varchar(50))+' and
partition_col < '+CAST(@next_partition_range_value as varchar(50))+');'
+N'ALTER TABLE
[mart].[fact_finance_work] WITH CHECK CHECK CONSTRAINT ck_newpartition;';

EXECUTE sp_executesql @sql_cmd

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)
,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

SET @msg = 'Switching data from [mart].


[fact_finance_work] to [mart].[fact_finance_queue]'
SET @step_nbr = @step_nbr + 1

ALTER TABLE [mart].[fact_finance_work]


SWITCH TO [mart].[fact_finance_queue] PARTITION @partition_number;

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT
,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END

ELSE IF @next_partition_range_value IS NULL


BEGIN

SET @msg = 'Recreate constraint on Fact


Finance Work table'
SET @step_nbr = @step_nbr + 1

SET @sql_cmd = N'ALTER TABLE [mart].


[fact_finance_work] WITH NOCHECK ADD CONSTRAINT ck_newpartition CHECK
(partition_col >= ' + CAST(@target_partition_range_value as varchar(50))+');'
+N'ALTER TABLE
[mart].[fact_finance_work] WITH CHECK CHECK CONSTRAINT ck_newpartition;';

EXECUTE sp_executesql @sql_cmd

SET @sql = N'EXECUTE [' +


@staging_db_name + '].[interim].[usp_write_log] @db_load_job_log_id =
@db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT

,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

SET @msg = 'Switching data from [mart].


[fact_finance_work] to [mart].[fact_finance_queue]'
SET @step_nbr = @step_nbr + 1

ALTER TABLE [mart].[fact_finance_work]


SWITCH TO [mart].[fact_finance_queue] PARTITION @partition_number;

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name


+ '].[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name = @package_name

, @task_name = @task_name

, @stored_proc_name = @stored_proc_name

, @step_nbr = @step_nbr

, @record_count = @record_count

, @message_type_key = ''C''

, @log_message = @msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT
,@package_name VARCHAR(100)

,@task_name VARCHAR(100)

,@stored_proc_name VARCHAR(100)

,@step_nbr SMALLINT

,@record_count INT

,@msg VARCHAR(1000)'

,@db_load_job_log_id = @db_load_job_log_id

,@package_name = @package_name

,@task_name = @task_name

,@stored_proc_name = @stored_proc_name

,@step_nbr = @step_nbr

,@record_count = @record_count

,@msg = @msg

END

--drop the check constraint

IF OBJECT_ID('mart.ck_newpartition', 'C') IS NOT NULL

BEGIN

SET @msg = 'Drop the check constraint'


SET @step_nbr = @step_nbr + 1

ALTER TABLE [mart].[fact_finance_work] DROP


CONSTRAINT ck_newpartition

SET @record_count= @@ROWCOUNT

SET @sql = N'EXECUTE [' + @staging_db_name +


'].[interim].[usp_write_log] @db_load_job_log_id = @db_load_job_log_id

, @package_name =
@package_name

, @task_name =
@task_name

, @stored_proc_name =
@stored_proc_name
, @step_nbr =
@step_nbr

, @record_count =
@record_count

, @message_type_key =
''C''

, @log_message =
@msg'

EXEC sp_executesql @sql,


N'@db_load_job_log_id INT
,@pack
age_name VARCHAR(100)
,@task
_name VARCHAR(100)
,@stor
ed_proc_name VARCHAR(100)
,@step
_nbr SMALLINT
,@reco
rd_count INT
,@msg
VARCHAR(1000)'
,@db_l
oad_job_log_id = @db_load_job_log_id
,@pack
age_name = @package_name
,@task
_name = @task_name
,@stor
ed_proc_name = @stored_proc_name
,@step
_nbr = @step_nbr
,@reco
rd_count = @record_count
,@msg
= @msg
END

END

--COMMIT TRANSACTION
SET @result = @success
END TRY

BEGIN CATCH

SET @result = @failure

--IF @@TRANCOUNT <> 0


-- ROLLBACK TRANSACTION
SET @msg = 'Error while performing: ' + @msg
SET @err_desc = ERROR_MESSAGE()
SET @err_code = ERROR_SEVERITY()
SET @err_state = ERROR_STATE()

SET @sql = N'EXECUTE [' + @staging_db_name + '].[interim].[usp_write_error]


@db_load_job_log_id = @db_load_job_log_id
, @package_name
= @package_name
, @task_name
= @task_name
, @stored_proc_name
= @stored_proc_name
, @step_nbr
= @step_nbr
, @record_count
= NULL
, @message_type_key
= ''E''
, @log_message
= @msg
, @error_code
= @err_code
, @error_message
= @err_desc'

EXEC sp_executesql @sql,N'@db_load_job_log_id INT


,@package_name VARCHAR(100)
,@task_name VARCHAR(100)
,@stored_proc_name VARCHAR(100)
,@step_nbr SMALLINT
,@msg
VARCHAR(1000)
,@err_code INT
,@err_desc VARCHAR(1000)'
,@db_load_job_log_id =
@db_load_job_log_id
,@package_name = @package_name
,@task_name = @task_name
,@stored_proc_name =
@stored_proc_name
,@step_nbr = @step_nbr
,@msg = @msg
,@err_code = @err_code
,@err_desc = @err_desc

RAISERROR(@msg, @err_code_default, @err_state)


END CATCH

END

You might also like