SnowConvert AI - SSIS¶
This section provides a comprehensive reference of SSIS elements and components that SnowConvert can convert to dbt and Snowflake. Control Flow elements (tasks and containers) become orchestration logic, while Data Flow components (sources, transformations, destinations) become dbt models.
Control Flow Elements¶
These SSIS Control Flow tasks and containers are supported:
Note: Unlisted Control Flow elements generate EWI SSC-EWI-SSIS0004.
Container Conversion Details¶
SSIS containers (Sequence, For Loop, ForEach, Event Handlers) are converted using an inline approach where container logic is expanded within the parent TASK or procedure rather than creating separate procedures.
Sequence Containers¶
Sequence containers (https://learn.microsoft.com/en-us/sql/integration-services/control-flow/sequence-container?view=sql-server-ver17) are converted inline within the parent TASK. The container’s boundaries are marked with comments in the generated code, and all tasks within the container execute sequentially in the same TASK scope.
Conversion characteristics:
- No separate procedure or TASK is created for the container
- Container boundaries are clearly marked BEGIN … END blocks
- All tasks execute sequentially within the parent TASK
- Task execution order based on precedence constraints is maintained
- Limitation: Only “Success” precedence constraints are fully supported. Conditional execution based on task outcomes (Failure or Completion constraints) is not currently implemented and will require manual post-migration adjustments
Behavioral differences:
- FDM generated: SSC-FDM-SSIS0003
- Variable scoping differs from SSIS: Container variables are accessible throughout the entire parent TASK, not just within the container scope
Example:
For Loop Containers¶
For Loop containers (https://learn.microsoft.com/en-us/sql/integration-services/control-flow/for-loop-container?view=sql-server-ver17) are converted to sequential execution of their contained tasks. However, the loop iteration logic itself requires manual implementation.
Conversion limitations:
- The container executes once by default (iteration logic not automatically converted)
- InitExpression, EvalExpression, and AssignExpression require manual conversion
- An EWI (SSC-EWI-SSIS0004) is generated to indicate manual work is needed
Required manual steps:
- Review EvalExpression to understand the loop termination condition
- Implement the iteration using Snowflake’s WHILE loop construct
- Update AssignExpression logic for proper loop counter management
ForEach Loop Containers¶
File Enumerator (Supported)
ForEach File Enumerator containers (https://learn.microsoft.com/en-us/sql/integration-services/control-flow/foreach-loop-container?view=sql-server-ver17) are converted to Snowflake stage operations using the LIST command and cursor pattern:
Configuration requirements:
After migration, you’ll need to:
- Replace
<STAGE_PLACEHOLDER>with your actual Snowflake stage name - Ensure the folder path is correctly mapped to a Snowflake stage
- Verify that files are properly staged in Snowflake
An EWI (SSC-EWI-SSIS0014) is generated to remind you of this manual configuration step.
Other Enumerator Types
Other ForEach enumerator types (ForEach Item, ForEach ADO, ForEach NodeList, etc.) aren’t currently supported. SnowConvert generates an EWI (SSC-EWI-SSIS0004) for these cases. Consider implementing the equivalent logic using Snowflake queries or scripting constructs.
Event Handlers¶
Event handlers (https://learn.microsoft.com/en-us/sql/integration-services/integration-services-ssis-event-handlers?view=sql-server-ver17) (OnError, OnWarning, OnPreExecute, OnPostExecute, etc.) aren’t supported. EWIs are generated. Implement manually using Snowflake exception handling.
Execute SQL Task¶
Execute SQL Tasks (https://learn.microsoft.com/en-us/sql/integration-services/control-flow/execute-sql-task?view=sql-server-ver17) are converted as inline SQL statements or separate stored procedures, depending on complexity and result set bindings.
Conversion approach:
- Simple SQL statements: Converted inline within the parent TASK
- Complex statements with result sets: May be converted to separate stored procedures
- Result bindings: Handled where possible; unsupported patterns generate EWI SSC-EWI-SSIS0011
Execute Package Task¶
Execute Package Tasks (https://learn.microsoft.com/en-us/sql/integration-services/control-flow/execute-package-task?view=sql-server-ver17) are handled differently based on package type:
| Package Type | Conversion | Notes |
|---|---|---|
| Local (single reference) | Inline execution within parent TASK | Package logic expanded inline |
| Reusable (2+ references or parameters) | CALL to stored procedure | Enables synchronous execution with parameters; generates FDM SSC-FDM-SSIS0005 |
| External | CALL with path resolution | Generates EWI SSC-EWI-SSIS0008 for manual verification |
Asynchronous execution note:
TASK-based Execute Package conversions run asynchronously. For synchronous behavior, packages are converted to stored procedures. See EWI SSC-EWI-SSIS0005.
Send Mail Task¶
Send Mail Tasks (https://learn.microsoft.com/en-us/sql/integration-services/control-flow/send-mail-task?view=sql-server-ver17) are converted to Snowflake Tasks that use SYSTEM$SEND_EMAIL with a dynamically created Notification Integration.
Key Differences from SSIS¶
| Aspect | SSIS | Snowflake |
|---|---|---|
| Email Service | Custom SMTP server | Snowflake’s built-in email service |
| Configuration | SMTP Connection Manager | Notification Integration |
| Sender Address | Custom FROM address | Fixed by Snowflake account |
| CC/BCC Support | Full support | Not supported (merged into recipients) |
| Attachments | File attachments supported | Not supported |
| HTML Body | Supported | Plain text only |
| Priority | High/Normal/Low | Not supported |
Property Mapping¶
| SSIS Property | Snowflake Equivalent | Notes |
|---|---|---|
| ToLine | ALLOWED_RECIPIENTS + recipients parameter | Direct mapping |
| FromLine | Prepended to message body | FDM SSC-FDM-SSIS0008 |
| CCLine | Added to recipients list | FDM SSC-FDM-SSIS0009 |
| BCCLine | Added to recipients list | FDM SSC-FDM-SSIS0010 (privacy concern) |
| Subject | subject parameter | Direct mapping |
| MessageSource | message parameter | Direct mapping |
| MessageSourceType (DirectInput) | Supported | - |
| MessageSourceType (Variable) | Supported | Variable reference converted |
| MessageSourceType (FileConnection) | Not supported | EWI SSC-EWI-SSIS0017 |
| Priority | Not supported | EWI SSC-EWI-SSIS0016 |
| FileAttachments | Not supported | EWI SSC-EWI-SSIS0015 |
| SMTPConnection | Managed by Snowflake | FDM SSC-FDM-SSIS0007 |
| BodyFormat (HTML) | Not supported | EWI SSC-EWI-SSIS0018 |
Conversion Output Structure¶
Each Send Mail Task is converted to a Snowflake Task containing:
- Notification Integration Creation: Created dynamically via
EXECUTE IMMEDIATE - SYSTEM$SEND_EMAIL Call: Sends the email through the integration
Conversion Examples¶
Basic Email (To, Subject, Body):
Email with FROM Address:
Email with Multiple Features (attachments, priority, CC):
Prerequisites for Snowflake Email¶
Before using converted Send Mail Tasks:
- Email Notification Integration permissions: Account admin must grant
CREATE INTEGRATION ON ACCOUNTto the executing role - Recipient verification: All email addresses in
ALLOWED_RECIPIENTSmust be verified in Snowflake - Update warehouse name: Replace
DUMMY_WAREHOUSEwith your actual warehouse name
Workarounds for Unsupported Features¶
File Attachments:
Upload files to a Snowflake stage and share links instead:
BCC Privacy:
Send separate emails to maintain recipient privacy:
Bulk Insert Task¶
Bulk Insert Tasks (https://learn.microsoft.com/en-us/sql/integration-services/control-flow/bulk-insert-task?view=sql-server-ver17) are converted to Snowflake Tasks that use COPY INTO with an inline FILE_FORMAT. The conversion generates a stage placeholder that you must configure before execution.
Key Differences from SSIS¶
| Aspect | SSIS | Snowflake |
|---|---|---|
| Data Source | File system path or UNC path | Snowflake Stage (internal or external) |
| File Format | Format file (.fmt/.xml) or inline options | FILE_FORMAT object or inline options |
| Native Format | Native/WideNative supported | Not supported (CSV, JSON, Parquet, etc.) |
| Row Filtering | FirstRow/LastRow options | Not directly supported |
| Batch Control | BatchSize configurable | Automatic management |
| Error Handling | MaximumErrors count | ON_ERROR behavior |
| Triggers | FireTriggers option | Not supported (use Streams/Tasks) |
| Table Locking | TableLock option | Not needed (MVCC) |
Property Mapping¶
| SSIS Property | Snowflake Equivalent | Notes |
|---|---|---|
| DestinationTableName | COPY INTO table | Square brackets [] removed |
| DataFileType (Char) | TYPE = 'CSV' | Direct mapping |
| DataFileType (Native) | Not supported | EWI SSC-EWI-SSIS0020 |
| FieldTerminator | FIELD_DELIMITER | Parsed from SSIS format |
| RowTerminator | RECORD_DELIMITER | Parsed from SSIS format |
| FirstRow | SKIP_HEADER | Value - 1 |
| LastRow | Not supported | EWI SSC-EWI-SSIS0021 |
| MaximumErrors | ON_ERROR | FDM SSC-FDM-SSIS0011 |
| KeepNulls=True | NULL_IF = () | Empty tuple |
| KeepNulls=False | NULL_IF = ('', 'NULL', 'null') | Default behavior |
| KeepIdentity=False | FDM generated | FDM SSC-FDM-SSIS0017 |
| TableLock=True | Not needed | FDM SSC-FDM-SSIS0014 |
| FireTriggers=True | Not supported | EWI SSC-EWI-SSIS0022 |
| FormatFile | Not supported | EWI SSC-EWI-SSIS0023 |
| CheckConstraints=True | Always enforced | FDM SSC-FDM-SSIS0016 |
| BatchSize | Automatic | FDM SSC-FDM-SSIS0012 |
| SortedData | Not available | FDM SSC-FDM-SSIS0015 |
Terminator Parsing¶
SSIS uses specific tokens for field and row terminators. These are converted to Snowflake escape sequences:
| SSIS Format | Snowflake Output |
|---|---|
{CR}{LF} | \r\n |
{CR} | \r |
{LF} | \n |
{TAB} | \t |
Tab | \t |
Comma {,} | , |
Semicolon {;} | ; |
Vertical Bar {|} | | |
Conversion Output Structure¶
Each Bulk Insert Task is converted to a Snowflake Task containing a COPY INTO statement with an inline FILE_FORMAT:
Conversion Examples¶
Basic Bulk Insert (CSV with default options):
Bulk Insert with Tab Delimiter and Header Skip:
Bulk Insert with Multiple EWIs (Native format, LastRow, FireTriggers):
Stage Setup (Required)¶
Before executing converted Bulk Insert Tasks, you must:
- Create a Snowflake stage:
- Upload files using SnowSQL CLI:
- Replace the stage placeholder in generated code:
- Verify files are staged:
Workarounds for Unsupported Features¶
Native Data Format:
Export SQL Server data to CSV format before migration. The native binary format is not supported by Snowflake.
LastRow Filtering:
Load to staging table and filter:
FireTriggers (Trigger-like Behavior):
Use Snowflake Streams and Tasks:
dbt Project Execution¶
Within the orchestration code, Data Flow Tasks are executed using Snowflake’s EXECUTE DBT PROJECT command:
Important requirements:
- The
project_namemust match the name you used when deploying the dbt project (viaCREATE DBT PROJECTor Snowflake Workspace deployment) - Arguments passed are standard dbt CLI arguments (like
build,run,test) - Each execution runs the entire dbt project with all models in dependency order
Deployment:
Before executing dbt projects in orchestration, deploy them using:
- Snowflake CLI:
snow dbt deploy --schema schema_name --database database_name --force package_name - Snowflake Workspace: Upload and deploy via UI
For complete deployment instructions, see the user guide.
Data Flow Components¶
These SSIS Data Flow sources, transformations, and destinations are supported:
Note: Unlisted Data Flow components generate EWI SSC-EWI-SSIS0001.