Where is the wisdom? Lost in the knowledge. Where is the knowledge? Lost in the information.
T. S. Eliot.
T. S. Eliot.
- [User::ZipFileName]
- [User::ZipFileLocation]
- [User::ZipPassword]
"a -tzip " + @[User::ZipFileName] + "_" + (DT_STR,4,1252)YEAR(GETDATE()) + RIGHT("0" + (DT_STR,2,1252)MONTH(GETDATE()),2) + RIGHT("0" + (DT_STR,2,1252)DAY(GETDATE()),2) + ".zip *.csv -P" + @[User::ZipPassword]
a -tzip DataExport_20130822.zip *.csv -PPa55word!
Name | DataType | Value |
BatchLogID | Int32 | 0 |
PackageLogID | Int32 | 0 |
EndBatchAudit | Boolean | False |
VariableValue | String | Unable to convert to string |
EXEC Clean.RemoveWhitespace NULL,'AdventureWorks','Person','Address','AddressLine2','Y','Y','P'
ALTER PROCEDURE [Clean].[RemoveWhitespace]
(
@BatchLogID INT,
@Database AS VARCHAR(50),
@Schema AS VARCHAR(50),
@Table AS VARCHAR(50),
@Column AS VARCHAR(50),
@TrimLeadingWhitespace AS CHAR(1), -- Options are "Y" or "N"
@TrimTrailingWhitespace AS CHAR(1), -- Options are "Y" or "N"
@PrintOrExecute AS CHAR(1) -- Options are "P" or "E". Print will just show what the sproc intended to clean, execute will actually do it.
)
AS
SET NOCOUNT ON
-- SPROC SPECIFIC VARIABLES
DECLARE @SQL VARCHAR(4000)
DECLARE @MatchingCode VARCHAR(100)
DECLARE @PKID VARCHAR(100)
DECLARE @MaxID SMALLINT
DECLARE @Counter SMALLINT
DECLARE @PKString VARCHAR(500)
DECLARE @LogLocation VARCHAR(100)
DECLARE @ErrorMessage VARCHAR(255)
SET @PKString = ''
SET @Counter = 0
SELECT @LogLocation = ConfigVariable FROM DataWarehouse.Common.Config WHERE ConfigDescription = 'ETL Cleanse Log Location'
-- CHECK FOR BATCHLOGID. IF NOT EXISTS THEN INITIATE BATCHLOG
IF ISNULL(@BatchLogID,0) = 0
BEGIN
INSERT INTO DataWarehouse.Audit.BatchLog(StartDatetime,[Status])
VALUES (GETDATE(), 'R')
SELECT @BatchLogID = SCOPE_IDENTITY()
END
-- BEGIN PROCESS
BEGIN TRY
BEGIN TRANSACTION
-- DEFINE THE LIKE CLAUSE FOR USE THROUGHOUT THE SPROC
SELECT @MatchingCode =
CASE WHEN (@TrimLeadingWhitespace = 'Y' AND @TrimTrailingWhitespace = 'N') THEN @Column + ' LIKE '' %'''
WHEN (@TrimLeadingWhitespace = 'N' AND @TrimTrailingWhitespace = 'Y') THEN @Column + ' LIKE ''% '''
ELSE @Column + ' LIKE '' %'' OR ' + @Column + ' LIKE ''% ''' END
-- DO THE CLEANSE BY UPDATING THE COLUMN
-- BEGIN BUILDING THE DYNAMIC SQL TO PERFORM THE CLEAN
SET @SQL = 'UPDATE ' + @Database + '.' + @Schema + '.' + @Table + ' SET ' + @Column + ' = '
-- APPEND TRIM FUNCTIONS REQUIRED
SELECT @SQL = @SQL +
CASE WHEN (@TrimLeadingWhitespace = 'Y' AND @TrimTrailingWhitespace = 'N') THEN 'LTRIM(' + @Column + ')'
WHEN (@TrimLeadingWhitespace = 'N' AND @TrimTrailingWhitespace = 'Y') THEN 'RTRIM(' + @Column + ')'
ELSE 'LTRIM(RTRIM(' + @Column + '))' END
-- COLLECT PK INFORMATION FOR OUTPUT COLUMNS
-- GET PK FOR SPECIFIED TABLE
EXEC DataWarehouse.Common.GetPrimaryKey @Database,@Schema,@Table,@PKList = @PKID OUTPUT
-- CREATE TEMP TABLE OF PK COLUMNS WITH IDENTITY
DECLARE @PKTable TABLE (ID INT IDENTITY(1,1), Items VARCHAR(100))
-- POPULATE TABLE VARIABLE
INSERT INTO @PKTable (Items) SELECT Items FROM DataWarehouse.Common.Spliter(@PKID,',')
-- GET MAXIMUM ID VALUE
SELECT @MaxID = MAX(ID) FROM @PKTable
-- BUILD THE STRING INTHE TABLE VARIABLE
UPDATE @PKTable SET Items = Items + ' = # + CAST(INSERTED.' + Items + ' AS VARCHAR(30))'
UPDATE @PKTable SET Items = Items + ' + #' WHERE ID <> @MaxID
UPDATE @PKTable SET Items = '(#' + Items WHERE ID = 1
UPDATE @PKTable SET Items = Items + ',' WHERE ID <> @MaxID
UPDATE @PKTable SET Items = Items + ') AS PrimaryKey' WHERE ID = @MaxID
UPDATE @PKTable SET Items = REPLACE(Items,'#',CHAR(39))
-- CONCATENATE THE ROWS INTO A STRING
WHILE(@Counter < @MaxID + 1)
BEGIN
SELECT @PKString = @PKString + Items FROM @PKTable WHERE ID = @Counter
SET @Counter = @Counter + 1
END
-- APPEND PK BUILD STRING TO DYNAMIC SQL
SET @SQL = @SQL + ' OUTPUT ' + @PKString +', ''' + @Column + ''' AS Column, DELETED.' + @Column + ' AS OldValue, INSERTED.' +
@Column + ' AS NewValue, GETDATE() AS ModifiedDate,''' + CAST(@BatchLogID AS VARCHAR(10)) + ''' AS BatchLogID, ''' +
CAST(OBJECT_NAME(@@PROCID) AS VARCHAR(50)) + ''' AS ProcedureName INTO ' + @LogLocation
-- APPEND WHERE CLAUSES TO DYNAMIC SQL
SET @SQL = @SQL + ' WHERE ' + @MatchingCode
-- PRINT OR EXECUTE DEPENDING ON PARAMETER
IF(@PrintOrExecute = 'P')
BEGIN
PRINT (@SQL)
END
ELSE
EXEC (@SQL)
-- COMPLETE THE TRANSACTION
COMMIT TRANSACTION
END TRY
-- RETURN ERRORS AND ROLLBACK WHEN ERRORS OCCUR
BEGIN CATCH
-- ROLLBACK
ROLLBACK TRANSACTION
-- REPORT ERROR
SET @ErrorMessage = ERROR_MESSAGE()
RAISERROR (@ErrorMessage,17,1)
END CATCH
GO
ALTER PROCEDURE [Common].[GetPrimaryKey]
(
@Database AS VARCHAR(50),
@Schema AS VARCHAR(50),
@Table AS VARCHAR(50),
@PKList AS VARCHAR(200) OUTPUT
)
AS
SET NOCOUNT ON
-- DECLARE VARIABLES
DECLARE @SQL NVARCHAR(500)
-- CATCH ERRORS USING TRY..CATCH
BEGIN TRY
-- BUILD DYNAMIC SQL TO QUERY SYS TABLES AND RETURN THE PK FOR SPECIFIED TABLE IN A CSV LIST
SET @SQL = 'USE ' + @Database + '
SELECT @PKList = COALESCE(@PKList + '','','''') + CAST(CCU.COLUMN_NAME AS VARCHAR(20))
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON TC.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME
WHERE TC.CONSTRAINT_TYPE = ''Primary Key''
AND TC.TABLE_CATALOG = ''' + @Database + '''
AND TC.TABLE_SCHEMA = ''' + @Schema + '''
AND TC.TABLE_NAME = ''' + @Table + ''''
-- EXECUTE THE DYNAMIC SQL
EXEC SP_ExecuteSQL @SQL, N'@PKList VARCHAR(200) OUTPUT', @PKList OUTPUT
END TRY
-- RETURN ERRORS AND ROLLBACK WHEN ERRORS OCCUR
BEGIN CATCH
-- REPORT ERRORS
SELECT ERROR_NUMBER() ErrorNumber, ERROR_SEVERITY() ErrorSeverity, ERROR_LINE() ErrorLine, ERROR_MESSAGE() ErrorMessage
END CATCH
GO
ALTER FUNCTION [Common].[Spliter](@String VARCHAR(8000), @Delimiter CHAR(1))
RETURNS @TempTable TABLE (Items VARCHAR(8000))
AS
BEGIN
DECLARE @IDX INT
DECLARE @Slice VARCHAR(8000)
SELECT @IDX = 1
IF LEN(@String)<1 OR @String IS NULL RETURN
WHILE @IDX!= 0
BEGIN
SET @IDX = CHARINDEX(@Delimiter,@String)
IF @IDX!=0
SET @Slice = LEFT(@String,@IDX - 1)
ELSE
SET @Slice = @String
IF(LEN(@Slice)>0)
INSERT INTO @Temptable(Items) VALUES(@Slice)
SET @String = RIGHT(@String,LEN(@String) - @IDX)
IF LEN(@String) = 0 BREAK
END
RETURN
END
GO
USE [master]
EXEC sp_dropdistributor @no_checks = 1, @ignore_distributor = 1
GO
1: IF OBJECT_ID('tempdb..#res') IS NOT NULL
2: DROP TABLE #res
3: GO
4: DECLARE @db SYSNAME,
5: @sql NVARCHAR(2000)
6: CREATE TABLE #res
7: (
8: server_name SYSNAME,
9: db_name SYSNAME,
10: db_collation SYSNAME,
11: table_name SYSNAME,
12: column_name SYSNAME,
13: column_collation SYSNAME
14: )
15: DECLARE c CURSOR
16: FOR
17: SELECT name
18: FROM sys.databases
19: WHERE NAME NOT IN ('master','model','tempdb','msdb') AND
20: state_desc = 'ONLINE'
21: OPEN c
22: WHILE 1 = 1
23: BEGIN
24: FETCH NEXT FROM c INTO @db
25: IF @@FETCH_STATUS <> 0
26: BREAK
27: SET @sql = 'SELECT
28: @@SERVERNAME AS server_name
29: ,''' + @db + ''' AS db_name
30: ,CAST(DATABASEPROPERTYEX(''' + @db + ''', ''Collation'') AS sysname) AS db_collation
31: ,OBJECT_NAME(c.object_id, ' + CAST(DB_ID(@db) AS SYSNAME) + ') AS table_name
32: ,c.name AS column_name
33: ,c.collation_name AS column_collation
34: FROM ' + QUOTENAME(@db) + '.sys.columns AS c
35: INNER JOIN ' + QUOTENAME(@db) + '.sys.tables AS t ON t.object_id = c.object_id
36: WHERE t.type = ''U''
37: AND c.collation_name IS NOT NULL
38: AND c.collation_name <> CAST(DATABASEPROPERTYEX(''' + @db + ''', ''Collation'') AS sysname)
39: '
40: --PRINT @sql
41: INSERT INTO #res
42: EXEC (@sql)
43: END
44: CLOSE c
45: DEALLOCATE c
46: SELECT *
47: FROM #res
USE MSDB
GO
SELECT J.Name AS JobName,
JS.Step_Name AS StepName,
CAST(CAST(NULLIF(Last_Run_Date,0) AS VARCHAR(8)) AS DATETIME)
+ STUFF(STUFF(RIGHT('00000' + CAST(Last_Run_Time AS VARCHAR(6)),6),3,0,':'),6,0,':') AS Last_Run_DateTime,
JS.Last_Run_Duration,
CASE WHEN (JS.Last_Run_Outcome = 1) THEN 'Succeeded' ELSE 'Failed' END Last_Run_Status,
JS.Database_Name,
JS.SubSystem,
JS.Command AS Command,
JS.Output_File_Name,
J.Date_Created,
J.Date_Modified,
SUSER_NAME(J.Owner_SID) AS Job_Owner
FROM SysJobs J
INNER JOIN SysJobSteps JS ON J.Job_ID = JS.Job_ID
--WHERE JS.SubSystem = 'SSIS'
CREATE TABLE [Metadata].[ErrorLog](
[ErrorLogID] [int] IDENTITY(1,1) NOT NULL,
[SystemUser] [nvarchar](128) NOT NULL,
[CreatedDateTime] [datetime] NOT NULL,
[ServerName] [nvarchar](128) NOT NULL,
[ErrorNumber] [int] NOT NULL,
[ProcedureName] [nvarchar](128) NOT NULL,
[LineNumber] [int] NOT NULL,
[Severity] [int] NOT NULL,
[State] [int] NOT NULL,
[Message] [nvarchar](4000) NOT NULL,
CONSTRAINT [PK_ErrorLog] PRIMARY KEY CLUSTERED
(
[ErrorLogID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [Metadata].[ErrorLog] ADD DEFAULT (getdate()) FOR [CreatedDateTime]
GO
/*
**********************************************************************************************************************************************************************************************************************
DW - InsertErrorLog
**********************************************************************************************************************************************************************************************************************
VERSION AUTHOR DATE COMMENTS
**********************************************************************************************************************************************************************************************************************
V1.0 GP 27/03/2012 Initial build of InsertErrorLog which is designed to take error details from inside a CATCH block and pass them to a central ErrorLog table
**********************************************************************************************************************************************************************************************************************
USAGE EXAMPLE
EXEC Common.InsertErrorLog 1234,'ProcedureName',1,17,1,'This is a test error message'
*/
CREATE PROCEDURE [Common].[InsertErrorLog]
(
@ErrorNumber INT,
@ProcedureName NVARCHAR(128),
@LineNumber INT,
@Severity INT,
@State INT,
@Message NVARCHAR(4000)
)
AS
SET NOCOUNT ON
DECLARE @SystemUser AS NVARCHAR(128)
DECLARE @ServerName AS NVARCHAR(128)
SET @SystemUser = SUSER_NAME()
SET @ServerName = CONVERT(SYSNAME, SERVERPROPERTY('SERVERNAME'))
-- POPULATE ERROR TABLE WITH SUBMITTED DATA
INSERT INTO DataWarehouse.Metadata.ErrorLog (SystemUser,ServerName,ErrorNumber,ProcedureName,LineNumber,Severity,State,Message)
VALUES (@SystemUser,@ServerName,@ErrorNumber,@ProcedureName,@LineNumber,@Severity,@State,@Message)
GO
1: USE [DataWarehouse]
2: GO
3: /****** Object: StoredProcedure [DataMart].[LoadDIMTime] Script Date: 03/28/2012 22:56:55 ******/
4: SET ANSI_NULLS ON
5: GO
6: SET QUOTED_IDENTIFIER ON
7: GO
8: /*
9: ***************************************************************************************************************************************************************
10: DW - LoadDIMTime
11: ***************************************************************************************************************************************************************
12: VERSION AUTHOR DATE COMMENTS
13: ***************************************************************************************************************************************************************
14: V1.0 GP 10/01/2012 Initial build of DIMTime
15: V1.1 GP 27/03/2012 Added ErrorLog functionality in the CATCH block
16: ***************************************************************************************************************************************************************
17: USAGE EXAMPLE
18: EXEC DataMart.LoadDIMTime
19: */
20: ALTER PROCEDURE [DataMart].[LoadDIMTime]
21: AS
22: BEGIN TRY
23: -- START AFRESH WITH AN EMPTY TABLE
24: TRUNCATE TABLE DataWarehouse.DataMart.DIMTime
25: -- INSERT DIMENSION MEMBERS
26: INSERT INTO DataWarehouse.DataMart.DIMTime
27: ( Hour ,
28: Minute ,
29: Meridiem
30: )
31: SELECT Hour ,
32: Minute ,
33: Meridiem
34: FROM DataWarehouse.DataSource.vwTime
35: OPTION ( MAXRECURSION 0 )
36: -- ADD THE UNKNOWN MEMBER. SUSPEND THE IDENTITY DURING INSERT
37: IF NOT EXISTS ( SELECT TimeKey
38: FROM DataWarehouse.DataMart.DIMTime
39: WHERE TimeKey = -1 )
40: BEGIN
41: SET IDENTITY_INSERT DataWarehouse.DataMart.DIMTime ON
42: INSERT INTO DataWarehouse.DataMart.DIMTime
43: ( TimeKey ,
44: Hour ,
45: Minute ,
46: Meridiem
47: )
48: SELECT -1 AS TimeKey ,
49: 0 AS Hour ,
50: 0 AS Minute ,
51: 'UN' AS Meridiem
52: SET IDENTITY_INSERT DataWarehouse.DataMart.DIMTime OFF
53: END
54: END TRY
55: -- RETURN ERRORS WHEN ERRORS OCCUR
56: BEGIN CATCH
57: -- REPORT ERRORS
58: DECLARE @ErrorNumber INT = ERROR_NUMBER()
59: DECLARE @ErrorProcedure NVARCHAR(128) = ERROR_PROCEDURE()
60: DECLARE @ErrorLine INT = ERROR_LINE()
61: DECLARE @ErrorSeverity INT = ERROR_SEVERITY()
62: DECLARE @ErrorState INT = ERROR_STATE()
63: DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE()
64: EXEC Common.InsertErrorLog @ErrorNumber, @ErrorProcedure, @ErrorLine,
65: @ErrorSeverity, @ErrorState, @ErrorMessage
66: END CATCH
67: GO

![]() |
| Data profiling template originally from John Welch. |