Naming Convention for SSIS Tasks — Make the Execution Log Readable at Last

An SSIS package fails, and the execution log is supposed to point to the cause. Instead it presents a tree in which the tasks do not appear in the order they ran, but alphabetically by name. For complex packages that log becomes plainly unreadable. The good news is that a well-considered naming convention makes it readable again, purely through the way tasks are named.

The essentials up front:

  • The problem: SSIS logs tasks alphabetically by task name per container, not in execution order — evidenced by screenshots from Visual Studio 2017, in the Progress tab as well as in the Integration Services Catalog reports (see the version note below).
  • Numbering as a prefix makes the intended execution order visible in the log.
  • A type prefix (DFTSQLSCR, …) makes the task type recognizable in a purely textual log.
  • A meaningful name plus the overall syntax XXXX [YYYY] ZZZ Name makes every task name unique and self-explanatory.
  • SSIS today runs on the VS 2022/2026 extension. The convention remains valid, and its principle carries over to modern ETL tools (Azure Data Factory, Fabric, dbt, Airflow).

Prerequisite: an SSIS project in Visual Studio (with the SQL Server Integration Services Projects extension). The screenshots are from Visual Studio 2017. The convention itself is not tied to a particular SSIS version. The statements about the logging behaviour refer to that tested state (see the version note).

Contents

Why SSIS Tasks Need a Naming Convention

Naming conventions are worth having only when they pay off in daily work. Usually the argument runs through the readability and maintainability of code. With SQL Server Integration Services (SSIS), another aspect comes into play: the way the execution of a package is logged in the Execution Results and Progress tab in Visual Studio. That execution is logged as a tree. For complex packages with child packages, For Each Loop containers, Sequence containers and the like, the tree quickly grows long and deep. Following the execution order of the tasks in it is hard, and so is identifying the cause quickly when something fails.

The reason for that is neither the complexity of a package nor its nesting depth. In the environment tested here (Visual Studio 2017), SSIS did not display the executed tasks in the order they ran. Instead it arranged them alphabetically by task name within each container. (For how this relates to Microsoft’s current documentation, see the version note in the section “SSIS Today”.)

The screenshot below shows a supposedly clear control flow after a run in Visual Studio 2017:

Control flow diagram in Visual Studio with two Sequence Containers whose names do not reflect the actual execution order.

Worth noting here:

  • The Sequence Containers are named so that the container with the suffix 2 runs before the container with the suffix 1.
  • Inside the Sequence Containers, the Control Flow Tasks are named so that the tasks with the prefix 2 run before those with the prefix 1.
  • Between the two Sequence Containers, three Script Tasks run whose prefixes CB and A contradict their execution order.

Both data flows contain identical Data Flow Tasks. They are named so that they run against the alphabetical order of their task names. OLE-DB Source runs first, Count only afterwards.

Two data flows with identical tasks whose names contradict the actual execution order — OLE-DB Source runs first, then Count.

In the Progress tab of the executed package, the Control Flow and Data Flow Tasks were logged not in the order they actually ran, but in the alphabetical order of the task names within each container:

Progress tab in Visual Studio: the tasks are sorted alphabetically by name, not in the order of their execution.

For large and complex transformation processes, matching a log entry to the actual sequence of execution becomes needlessly hard. The screenshots so far cover the development of SSIS packages. What about running SSIS solutions in production, once they are deployed to the Integration Services Catalog? The execution log of a deployed package can be opened through the standard reports

right-click on project/package > Reports | Standard Reports | All Executions

And in the same tested state, this standard report also showed the executed tasks out of their actual order (the screenshot below is the evidence). The underlying SSISDB does store start and end times for every executed element, so a query of one’s own could reconstruct the real sequence. The standard presentation simply did not make it directly readable:

Integration Services Catalog standard report "All Executions": in production, too, the tasks are logged by name rather than by execution order.

That calls for a way of naming tasks that makes the log follow the order of execution. Three widely used building blocks improve the readability of a package at design time as well as the readability of its log at run time:

  • Number every task according to its execution order
  • Use a prefix for each task type
  • Give every task a name that says what it does

Numbering Tasks According to Their Execution Order

For the numbering, Control Flow Tasks and Data Flow Tasks need to be treated separately.

Control Flow Tasks

Every task should carry an ascending number as a prefix that matches the execution order. Where branches run in parallel there is no single linear order, and the numbering then reflects the sequence as it was modelled. A four-digit range (numbers up to 9999) with leading zeros for smaller values has proven practical. The numbering should leave gaps, so that a changed order can take new numbers without renaming all the tasks that follow. Numbering tasks does take effort. Experience from multi-developer projects shows that the convention is widely accepted and pays off.

Control flow with numbered task prefixes (four digits, with gaps) that match the execution order.

The execution log below now lists the tasks in the order they ran, which makes it far more readable than the first version:

Execution log after introducing the numbering: the tasks now appear in execution order and are readable.

Data Flow Tasks

In the Progress and Catalog context looked at here, the data flow itself is logged as a task. Its individual components do not appear there as separate task entries. Naming them is therefore less about sorting than about identifying them unambiguously when something fails. It is worth carrying the scheme described above into data flows as well, and extending it a little:

Data flow with a two-part numbering as a prefix on every task: control flow number plus data flow number.

The first Data Flow Task to run carries the number 0110 as its prefix. Every task inside that data flow keeps this prefix and adds a second number of its own, which makes each of them uniquely identifiable. Every Data Flow Task name therefore starts with two numbers.

  • Control flow number
  • Data flow number

When something goes wrong, the log names the Data Flow Task that caused the error. Unique numbers make that task easy to pin down, and above all quick to find:

Error case: the log names the unique name of the data flow task that caused the error.

Use a Prefix for Each Task Type

In Visual Studio every task type has its own pictogram. The size available for those icons limits how much a stylised image can convey. On top of that, a pictogram is a visual device, and the execution log has none. Telling the tasks apart in the Execution Results and Progress tab therefore calls for a prefix that identifies the type of the task.

To improve readability, it has proven useful to prefix task names with an abbreviation that depends on the task type:

  • DFT for Data Flow Task
  • SCR for Script Task
  • SQL for Execute SQL Task

The internet holds a number of suggestions for such prefixes. The two lists below show the prefix convention that has proven itself in the projects behind this article, an example convention rather than a current reference catalogue. They reflect the component landscape of the time they were written: the Azure components require the Azure Feature Pack, the SQL Server Compact Destination is no longer supported in current Visual Studio versions, and the KingswaySoft entries are third-party components (see the “Supplier” column).

Prefixes for Control Flow Tasks

TaskPrefix
Back Up Database TaskBACKUP
CDC Control TaskCDC
Check Database Integrity TaskCHECKDB
Data Profiling TaskDPT
Execute SQL Server Agent Job TaskAGENT
Execute T-SQL Statement TaskTSQL
History Cleanup TaskHISTCT
Maintenance Cleanup TaskMAINCT
Notify Operator TaskNOT
Rebuild Index TaskREBIT
Reorganize Index TaskREOIT
Shrink Database TaskSHRINKDB
Update Statistics TaskSTAT
For Loop ContainerFLC
Foreach Loop ContainerFELC
Sequence ContainerSEQC
ActiveX ScriptAXS
Analysis Services Execute DDL TaskASE
Analysis Services Processing TaskASP
Bulk Insert TaskBLK
Data Flow TaskDFT
Data Mining Query TaskDMQ
Execute Package TaskEPT
Execute Process TaskEPR
Execute SQL TaskSQL
Expression TaskEXPR
File System TaskFSYS
FTP TaskFTP
Message Queue TaskMSMQ
Script TaskSCR
Send Mail TaskSMT
Transfer Database TaskTDB
Transfer Error Messages TaskTEM
Transfer Jobs TaskTJT
Transfer Logins TaskTLT
Transfer Master Stored Procedures TaskTSP
Transfer SQL Server Objects TaskTSO
Web Service TaskWST
WMI Data Reader TaskWMID
WMI Event Watcher TaskWMIE
XML TaskXML

Prefixes for Data Flow Tasks

TaskPrefixTypeSupplier
ADO NET SourceADO_SRCSource
Azure Blob SourceAB_SRCSource
CDC SourceCDC_SRCSource
DataReader SourceDR_SRCSource
Excel SourceEX_SRCSource
Flat File SourceFF_SRCSource
HDFS File SourceHDFS_SRCSource
OData SourceODATA_SRCSource
ODBC SourceODBC_SRCSource
OLE DB SourceOLE_SRCSource
Raw File SourceRF_SRCSource
SharePoint List SourceSPL_SRCSource
XML SourceXML_SRCSource
AggregateAGGTransformation
AuditAUDTransformation
Balanced Data DistributorBDDTransformation
Cache TransformCCHTransformation
CDC SplitterCDCSTransformation
Character MapCHMTransformation
Conditional SplitCSPLTransformation
Copy ColumnCPYCTransformation
Data ConversionDCNVTransformation
Data Mining QueryDMQTransformation
Derived ColumnDERTransformation
DQS CleansingDQSCTransformation
Export ColumnEXPCTransformation
Fuzzy GroupingFZGTransformation
Fuzzy LookupFZLTransformation
Import ColumnIMPCTransformation
LookupLKPTransformation
MergeMRGTransformation
Merge JoinMRGJTransformation
MulticastMLTTransformation
OLE DB CommandCMDTransformation
Percentage SamplingPSMPTransformation
PivotPVTTransformation
Row CountCNTTransformation
Row SamplingRSMPTransformation
Script ComponentSCRTransformation
Slowly Changing DimensionSCDTransformation
SortSRTTransformation
Term ExtractionTEXTransformation
Term LookupTELTransformation
Union AllALLTransformation
UnpivotUPVTTransformation
ADO NET DestinationADO_DSTDestination
Azure Blob DestinationAB_DSTDestination
Data Mining Model TrainingDMMT_DSTDestination
Data Streaming DestinationDS_DSTDestination
DataReaderDestDR_DSTDestination
Dimension ProcessingDP_DSTDestination
Excel DestinationEX_DSTDestination
Flat File DestinationFF_DSTDestination
HDFS File DestinationHDFS_DSTDestination
ODBC DestinationODBC_DSTDestination
OLE DB DestinationOLE_DSTDestination
Partition ProcessingPP_DSTDestination
Raw File DestinationRF_DSTDestination
Recordset DestinationRS_DSTDestination
SharePoint List DestinationSPL_DSTDestination
SQL Server Compact DestinationSSC_DSTDestination
SQL Server DestinationSS_DSTDestination
Microsoft Dynamics 365 CE/CRM SourceCRM_SRCSourceKingswaySoft Software
Microsoft Dynamics 365 CE/CRM DestinationCRM_DSTDestinationKingswaySoft Software
Oracle Eloqua SourceELO_SRCSourceKingswaySoft Software
Oracle Eloqua DestinationELO_DSTDestinationKingswaySoft Software

Task Names

Finally, the task name itself should describe briefly what the task does, for example Import Customer or Check Data Types.

Naming Convention

For troubleshooting, all task names within an SSIS package should be unique, whether they belong to a Control Flow Task or a Data Flow Task. The following naming convention ensures that and follows this syntax:

XXXX [YYYY] ZZZ Name

with

XXXX

  • Numbering of the Control Flow Tasks.
  • The numbering of Control Flow Tasks should have four digits.
  • Smaller numbers are written with leading zeros.
  • The numbering should leave gaps, so that new numbers can be inserted when the control flow order changes (precedence constraints), without renaming all the tasks that follow.

YYYY

  • Numbering of the Data Flow Tasks.
  • The numbering of Data Flow Tasks always carries as its prefix the number of the Control Flow Task of type Data Flow (XXXX).
  • The numbering of Data Flow Tasks should have four digits.
  • Smaller numbers are written with leading zeros.
  • The numbering should leave gaps, so that new numbers can be inserted when the control flow order changes (precedence constraints), without renaming all the tasks that follow.

ZZZ

  • Prefix that identifies the type of the Control Flow or Data Flow Task.
  • See the list of prefixes above.

Name

  • A short and meaningful description of what the task does.

Two complete examples: 0100 SQL Truncate Staging for an Execute SQL Task in the control flow, and 0110 0200 LKP Lookup Customer for a Lookup component in the data flow of the control flow task 0110.

SSIS Today: Tooling Update and Context

The screenshots in this article come from Visual Studio 2017, and the convention itself has remained valid ever since. What has changed is the tooling: SSIS packages are built today with the separately installed SQL Server Integration Services Projects 2022+ extension, which supports Visual Studio 2022 and 2026 and covers target versions up to SQL Server 2025 (from SQL Server 2019 according to the SSDT documentation, from SQL Server 2017 according to the release notes of the extension). The basic concepts of execution monitoring are still in place, with the Progress and Execution Results tabs and the Catalog reports. How they present and sort the entries in detail is worth checking for the version in use.

Version note: The screenshots in this article document the behaviour of the Progress tab in Visual Studio 2017. The logged tasks appear there alphabetically by name within each container, not in the order they actually ran. Microsoft’s current documentation, by contrast, describes the Progress tab as showing entries “in execution order”. Whether or when that behaviour changed is not apparent from the sources. For newer SSIS versions a short test of your own is therefore worthwhile. The naming convention makes sense regardless, because it makes tasks easier to identify at design time and in the log alike.

The convention stays useful in either case, because its three building blocks work independently of the exact sort order. A numbering makes the log scannable, a type prefix makes the task type recognizable in plain text, and a unique name allows unambiguous attribution when something fails, no matter how the entries are arranged.

Where ETL Is Heading

SSIS remains the established on-premises ETL engine and is still maintained. For new projects the centre of gravity is shifting, though. In the Microsoft world, Azure Data Factory and Microsoft Fabric take over cloud orchestration. In the open-source and Postgres ecosystem, dbt (transformation) and Apache Airflow (orchestration) have become established. The core idea of this article carries over directly. There, too, consistent naming of steps and models decides whether a run log stays readable.

Conclusion

In the state tested here (Visual Studio 2017), SSIS logged the tasks alphabetically by name within each container, in the Progress tab as well as in the Catalog reports. A naming convention built from three parts makes the log readable regardless: a four-digit numbering with gaps makes the intended execution order visible, a type prefix makes the task type recognizable in plain text, and a meaningful name attributes every entry unambiguously when something fails. Together they form the syntax XXXX [YYYY] ZZZ Name. The convention costs a little discipline while building a package and pays off at every hunt for an error, whatever the Visual Studio version, and in principle in modern ETL stacks from Azure Data Factory to Airflow as well.

FAQ

Why can SSIS execution logs be hard to read?

In the state tested here (Visual Studio 2017), SSIS sorted the tasks in the execution log alphabetically by task name within each container, both in the Progress and Execution Results tab and in the reports of the Integration Services Catalog. Microsoft’s current documentation, by contrast, describes the Progress tab as showing entries “in execution order” (see the version note above). A numbering prefix helps either way, because it brings the alphabetical sort into line with the intended execution order.

How do you number Data Flow Tasks correctly?

Every Data Flow Task gets two four-digit numbers as a prefix: first the number of the parent Control Flow Task of type Data Flow, then a number of its own within the data flow. That keeps every task uniquely identifiable in the error log as well. Both number ranges should leave gaps, so the order can be changed later without renaming all the tasks.

Which prefix goes with which task type?

There is no official Microsoft specification. The two tables above list the example convention used here (DFT for Data Flow Task, SQL for Execute SQL Task, SEQC for Sequence Container and so on). What matters is less the exact abbreviation than consistency across the team: agree on the list once and then stick to it.

Does the convention also apply in the broader SSIS context?

Yes. The naming convention is one building block of maintainable SSIS solutions, alongside logging an ETL process, the source code management of SSIS packages, and the fundamental trade-off of SSIS vs. T-SQL and how much SQL belongs in an SSIS package.