Rename DTS Tasks for Clear Log Text
This Script will create a copy of your DTS Package; append "_Renamed" to the end of the package name; and rename every task and step in the copied package to Task/Step_TaskType_DescriptionText_Sequence.
The resulting package will lose all of it's text annotations, the layout will be the designer default rather than the original latout. It can run unnattended and will generate meaningful log text.
Please read the usage carefully because some cautions are necessary to use this script.
'**********************************************************************
'* Fun With ActiveX Scripts
'**********************************************************************
'* Rename Tasks and Steps for Meaningful Log Text
'**********************************************************************
'* Author:
'* Lane Tharp
'* CountryWide Financial Services
'* Performance Management Group
'* Plano, Texas
'* 2004/12/31
'* ----------------------------------------
'* Description:
'* This Script renames the Tasks and Steps of a DTS Package to the task description.
'* This makes the DTS Package Execution Logs meaningful and useful for debugging.
'* ----------------------------------------
'* Caution:
'* This script can generate a DTS Package that is not editable if used incorrectly.
'* This script will create a copy of the host script and rename the copy.
'* This copy will be created on the (Local) Server.
'* This copy will be editable but the layout will be redone by SQL Server.
'* NEVER SAVE AFTER RUNNING THIS SCRIPT OR THE PACKAGE WILL NOT BE EDITABLE.
'* ----------------------------------------
'* Useage:
'* 1. Add an ActiveX Script Task to Package being renamed in DTS Designer.
'* 2. Disable this Task in workflow properties so it does not run with package.
'* 3. Copy this script into the ActiveX Task.
'* 4. The (local) SA SQL User and password are required to make the renamed copy.
'* - Find "SA" and supply the password in the parameter after "SA".
'* - IE: "SA", "password"
'* 5. Make a backup copy of the package. (Do not skip this step)
'* 6. Save the package. (Do not skip this step)
'* 7. Execute the ActiveX script in DTS Designer and close the package without saving.
'* 8. Refresh the "Local Packages" node in Enterprise Manager and look for a new
'* package with "_Renamed" added to the name.
'**********************************************************************
'-------------------------------------------------------------------------------------
' Big Fat Clarifying Note: (Be clear on this)
' - Steps are named after the tasks they constrain precedence for by DTS.
' - Step Names are not the *description* shown in workflow properties, they
' are the *name* shown in the disconnected edit properties.
'-------------------------------------------------------------------------------------
' Naming Convention:
' - Old Name Format: "DTSTask_DTSExecuteSQLTask_1"
' - Old Name Description: "Load Table"
' - New Name Format: "TaskExecuteSQL_LoadTable_1"
' - IE:"Object+Type+_Delimiter+PreparedDescriptionText+_Delimiter_Sequence"
' Naming Note:
' - Underscore in name is necessary to demarcate name from task type
' in future renaming.
' - Sequence in name is necessary to eliminate duplicate names
'-------------------------------------------------------------------------------------
' Debug Note:
' - This script is not intended for unnattended execution.
' - Do not edit scripts in the ActiveX Task Properties in DTS. (You will go blind.)
' - Edit as .vbs file in, and *debug* scripts in the Microsoft Script Editor.
'-------------------------------------------------------------------------------------
'************
'* Main
'************
Function Main()
Dim loPackage
Dim lsPackageName
'Stop
Main = DTSTaskExecResult_Success
' Get Package Object
Set loPackage = DTSGlobalVariables.Parent
' Save Name
lsPackageName = loPackage.Name
' Rename Tasks in Copy of Package
If RenameTasks(loPackage) = False Then _
Main = DTSTaskExecResult_Failure
' Save Renamed Copy of Package (Editable)
' Note: Package Object Referenced to new name
loPackage.SaveToSQLServerAs lsPackageName & "_Renamed", "(Local)", "SA", "enigma"
' Destroy Objects
Set loPackage = Nothing
End Function
'*****************
'* Rename Tasks
'*****************
Function RenameTasks(ByRef loPackage)
On Error Resume Next
'--------------
' Debug'Stop
'Stop
Dim loTask
Dim loTasks
Dim loProperties
Dim loProperty
Dim lnStart
Dim lnLength
Dim lsTaskType
Dim lsDescription
Dim lsTaskNameNew
Dim lsTaskNameOld
Dim lnNameSequence
Dim lsMessage
'--------------------------
' Initialize
RenameTasks = True
lnNameSequence = 0
' Get Tasks Collection
Set loTasks = loPackage.Tasks
'----------------------
' Loop Through Tasks
For Each loTask In loTasks
' Increment Name Sequence
lnNameSequence = lnNameSequence + 1
' Initialize Names
lsTaskNameNew = ""
lsTaskNameOld = loTask.Name
'-------------------------------
' Task has not been Renamed
'-------------------------------
' Old Name Format: "DTSTask_DTSExecuteSQLTask_1"
If Left(loTask.name,8) = "DTSTask_" Then
'-----------------------
' Generate New Name
' Remove DTSTask_ From Old Name
lsWork = Mid(loTask.name,9,Len(loTask.name))
' Task Type - Get Type Description From Old Name
lsTaskType = Left(lsWork,InStr(lsWork,"_")-1)
' Task Type - Strip "DTS" From Begining and "Task" From End of Old Task Type
lsTaskType = Mid(lsTaskType,4,Len(lsTaskType)-7)
' Prepare Description Text for use in Name
lsDescription = PrepareNameFromDescription(loTask.Description)
' New Name = "Object+Type+_Delimiter+PreparedDescriptionText"
lsTaskNameNew = _
"Task" + lsTaskType + "_" + _
lsDescription + "_" + Cstr(lnNameSequence)
' Check For Errors
If Err.Number <> 0 Then
'Stop '<---- Opens Debugger
RenameTasks = False ' <- Fail Script
End If
'-----------------------------------
' Task has already been renamed
'-----------------------------------
' New Name Format: "TaskExecuteSQL_LoadTable_1"
Else
'--------------------------------------------------------------
' Verify naming Convention for change in task description
' Get Description From Name
lsWork = Mid(loTask.Name,InStr(loTask.Name,"_") + 1)
lsWork = Mid(lsWork,1,InStr(loTask.Name,"_") - 1)
' Get Description Text to verify Name
lsDescription = PrepareNameFromDescription(loTask.Description)
' Populate New from old in case of no change
lsTaskNameNew = lsTaskNameOld
' Check for change in description
If lsWork <> lsDescription Then
' Rename with new description
lsTaskNameNew = _
Left(loTask.Name,InStr(loTask.Name,"_")) + _
lsDescription + "_" + Cstr(lnNameSequence)
End If
' Check For Errors
If Err.Number <> 0 Then
'Stop '<---- Opens Debugger
RenameTasks = False ' <- Fail Script
End If
End If
'<-- Exit #1
If RenameTasks = True Then
'---------------------------
' Change Name if Changed
If lsTaskNameNew <> lsTaskNameOld Then
' Rename task
loTask.Name = lsTaskNameNew
' Check For Errors
If Err.Number <> 0 Then
'Stop '<---- Opens Debugger
RenameTasks = False ' <- Fail Script
End If
'<-- Exit #2
If RenameTasks = True Then
'------------------------------------------
' Change name in all referencing steps
If RenameTaskStep( _
loPackage, lsTaskNameOld, lsTaskNameNew) = False Then
' Step Rename Failed
loTask.Name = lsTaskNameOld
'Stop ' <-- Activates Debugger
RenameTasks = False ' <- Fail Script
End If
'<-- Exit #2
End If
End If
'<-- Exit #1
End If
Next
' Destroy Objects
Set loTask = Nothing
Set loTasks = Nothing
' Check For Errors
If Err.Number <> 0 Then
'Stop '<---- Opens Debugger
Main = DTSTaskExecResult_Failure ' <- Fail Script
End If
End Function
'***********************************************
'* Rename Task In Step
'***********************************************
Function RenameTaskStep(ByRef loPackage, lsTaskNameOld, lsTaskNameNew)
On Error Resume Next
Dim loStep
Dim loSteps
Dim lsStepNameOld
Dim lsStepNameNew
RenameTaskStep = True
'----------------------------------------
' Establish Old And New Step Names
' Old step was not renamed
If Left(lsTaskNameOld,8) = "DTSTask_" Then
lsStepNameOld = "DTSStep_" + Mid(lsTaskNameOld, 9)
' Old step was renamed
Else
lsStepNameOld = "Step" + Mid(lsTaskNameOld,5)
End If
lsStepNameNew = "Step" + Mid(lsTaskNameNew,5)
' Check For Errors
If Err.Number <> 0 Then
'Stop '<---- Opens Debugger
RenameTaskStep = False ' <- Fail Function
End If
'<-- Exit #1
If RenameTaskStep = True Then
'--------------------------
' Rename Task Step
Set loSteps = loPackage.Steps
Set loStep = loSteps.Item(Cstr(lsStepNameOld))
loStep.Name = lsStepNameNew
loStep.TaskName = lsTaskNameNew
'---------------------------------------------------------------
' Correct Step name in other Step precedence Constraints
If RenameStepInPresedenceConstraints( _
loPackage, lsStepNameOld, lsStepNameNew) = False Then
' Step Rename Failed
loStep.Name = lsStepNameOld ' <-- Reverse Change
'Stop ' <-- Activates Debugger
RenameTaskStep = False ' <- Fail Function
End If
'<-- Exit #1
End If
' Destroy Objects
Set loStep = Nothing
Set loSteps = Nothing
' Check For Errors
If Err.Number <> 0 Then
'Stop '<---- Opens Debugger
RenameTaskStep = False ' <- Fail Function
End If
End Function
'***********************************************
'* Rename Step In Precedence Constraints
'***********************************************
Function RenameStepInPresedenceConstraints(_
ByRef loPackage, lsStepNameOld, lsStepNameNew)
On Error Resume Next
Dim loStep
Dim loSteps
Dim loPrecedenceConstraints
Dim loPrecedenceConstraint
RenameStepInPresedenceConstraints = True
'-------------------
' Loop Steps
Set loSteps = loPackage.Steps
For Each loStep in loPackage.Steps
Set loPrecedenceConstraints = loStep.PrecedenceConstraints
' Loop Presedence Constraints
For Each loPrecedenceConstraint in loPrecedenceConstraints
If loPrecedenceConstraint.StepName = lsStepNameOld Then
loPrecedenceConstraint.StepName = lsStepNameNew
End If
Next
Next
' Destroy Objects
Set loStep = Nothing
Set loSteps = Nothing
Set loPrecedenceConstraint = Nothing
Set loPrecedenceConstraints = Nothing
' Check For Errors
If Err.Number <> 0 Then
'Stop '<---- Opens Debugger
RenameStepInPresedenceConstraints = False ' <- Fail Script
End If
End Function
'***********************************************
'* Prepare Task Name From Description
'***********************************************
Function PrepareNameFromDescription(lsDescription)
On Error Resume Next
Dim lsWork
Dim lnStart
PrepareNameFromDescription = "??????????????"
' Copy Description
lsWork = lsDescription
' Trim Work String
lsWork = Trim(lsWork)
' Check For Errors
If Err.Number <> 0 Then
'Stop '<---- Opens Debugger
Exit Function ' <----- Returns Question Marks
End If
' Remove Spaces
Do
lnStart = InStr(lsWork," ")
If lnStart = 0 Then Exit Do
lsWork = Left(lsWork,lnStart-1) & Right(lsWork, Len(lsWork)-lnStart)
Loop
' Check For Errors
If Err.Number <> 0 Then
'Stop '<---- Opens Debugger
Exit Function ' <----- Returns Question Marks
End If
' Remove UnderScores
Do
lnStart = InStr(lsWork,"_")
If lnStart = 0 Then Exit Do
lsWork = Left(lsWork,lnStart-1) & Right(lsWork, Len(lsWork)-lnStart)
Loop
' Check For Errors
If Err.Number <> 0 Then
'Stop '<---- Opens Debugger
Exit Function ' <----- Returns Question Marks
End If
' Return Prepared Name
PrepareNameFromDescription = lsWork
End Function
'*******************************************************
'* Graveyard
'*******************************************************
' Enum Properties
' 'Stop
' lsMessage = "-----------------------------------------------------------" & Chr(13)
' lsMessage = "Properties For Task: " & loTask.Name & " " & Chr(13)
' lsMessage = "-----------------------------------------------------------" & Chr(13)
' Set loProperties = loTask.Properties
' For Each loProperty In loProperties
' If loProperty.Get Then
' lsMessage = loProperty.Name & ": " & loProperty.Value & Chr(13)
' End If
' Next