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:
Element |
Category |
Conversion Target |
Notes |
|---|---|---|---|
Task |
Complete dbt Project |
- |
|
Task |
Inline SQL or Stored Procedure |
- |
|
Task |
Inline EXECUTE TASK or PROCEDURE call |
- |
|
Task |
SYSTEM$SEND_EMAIL with Notification Integration |
Some features not supported; See Send Mail Task section |
|
Container |
Inline sequential execution |
- |
|
Container |
Sequential execution |
Manual iteration logic required; Check EWI SSC-EWI-SSIS0004 for more information |
|
Container |
LIST/CURSOR pattern |
Requires stage mapping; Check EWI SSC-EWI-SSIS0014 for more information |
|
Container |
Not converted |
Implement manually using Snowflake exception handling |
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 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:
-- BEGIN Sequence Container: MySequence
-- Task 1 within sequence
EXECUTE DBT PROJECT public.DataFlow1 ARGS='build --target dev';
-- Task 2 within sequence
EXECUTE DBT PROJECT public.DataFlow2 ARGS='build --target dev';
-- END Sequence Container: MySequence
For Loop Containers¶
For Loop containers 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 are converted to Snowflake stage operations using the LIST command and cursor pattern:
-- List files from Snowflake stage
LIST @<STAGE_PLACEHOLDER>/FolderPath PATTERN = '.*/file_pattern\.csv';
-- Create cursor for iteration
LET file_cursor CURSOR FOR
SELECT REGEXP_SUBSTR($1, '[^/]+$') AS FILE_VALUE
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE $1 NOT LIKE '%FolderPath/%/%';
-- Iterate through files
FOR file_row IN file_cursor DO
User_CurrentFileName := :file_row.FILE_VALUE;
EXECUTE DBT PROJECT public.My_DataFlow_Project ARGS='build --target dev';
END FOR;
Configuration requirements:
After migration, you’ll need to:
Replace
<STAGE_PLACEHOLDER>with your actual Snowflake stage nameEnsure 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 (OnError, OnWarning, OnPreExecute, OnPostExecute, etc.) aren’t supported. EWIs are generated. Implement manually using Snowflake exception handling.
Execute SQL Task¶
Execute SQL Tasks 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 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 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 |
|
Direct mapping |
FromLine |
Prepended to message body |
|
CCLine |
Added to recipients list |
|
BCCLine |
Added to recipients list |
FDM SSC-FDM-SSIS0010 (privacy concern) |
Subject |
|
Direct mapping |
MessageSource |
|
Direct mapping |
MessageSourceType (DirectInput) |
Supported |
- |
MessageSourceType (Variable) |
Supported |
Variable reference converted |
MessageSourceType (FileConnection) |
Not supported |
|
Priority |
Not supported |
|
FileAttachments |
Not supported |
|
SMTPConnection |
Managed by Snowflake |
|
BodyFormat (HTML) |
Not supported |
Conversion Output Structure¶
Each Send Mail Task is converted to a Snowflake Task containing:
Notification Integration Creation: Created dynamically via
EXECUTE IMMEDIATESYSTEM$SEND_EMAIL Call: Sends the email through the integration
CREATE OR REPLACE TASK public.my_package_send_mail_task
WAREHOUSE=DUMMY_WAREHOUSE
AFTER public.my_package
AS
BEGIN
-- Step 1: Create Notification Integration dynamically
BEGIN
LET my_package_Send_Mail_Task_integration_sql STRING := 'CREATE OR REPLACE NOTIFICATION INTEGRATION my_package_Send_Mail_Task
TYPE=EMAIL
ENABLED=TRUE
ALLOWED_RECIPIENTS=("admin@example.com", "team@example.com")';
EXECUTE IMMEDIATE :my_package_Send_Mail_Task_integration_sql;
END;
-- Step 2: Send the email
CALL SYSTEM$SEND_EMAIL('my_package_Send_Mail_Task', 'admin@example.com,team@example.com', 'Subject', 'Message body');
END;
Conversion Examples¶
Basic Email (To, Subject, Body):
BEGIN
BEGIN
LET my_package_Send_Mail_Task_integration_sql STRING := 'CREATE OR REPLACE NOTIFICATION INTEGRATION my_package_Send_Mail_Task
TYPE=EMAIL
ENABLED=TRUE
ALLOWED_RECIPIENTS=("admin@example.com")';
EXECUTE IMMEDIATE :my_package_Send_Mail_Task_integration_sql;
END;
CALL SYSTEM$SEND_EMAIL('my_package_Send_Mail_Task', 'admin@example.com', 'Daily Report', 'The daily report is ready.');
END;
Email with FROM Address:
BEGIN
BEGIN
LET my_package_Send_Mail_Task_integration_sql STRING := 'CREATE OR REPLACE NOTIFICATION INTEGRATION my_package_Send_Mail_Task
TYPE=EMAIL
ENABLED=TRUE
ALLOWED_RECIPIENTS=("noreply@company.com", "admin@example.com")';
EXECUTE IMMEDIATE :my_package_Send_Mail_Task_integration_sql;
END;
--** SSC-FDM-SSIS0008 - SNOWFLAKE'S EMAIL INTEGRATION USES A FIXED SENDER ADDRESS. THE ORIGINAL FROM ADDRESS HAS BEEN PREPENDED TO THE MESSAGE BODY FOR REFERENCE. **
CALL SYSTEM$SEND_EMAIL('my_package_Send_Mail_Task', 'noreply@company.com,admin@example.com', 'Notification', 'Email sent by: noreply@company.com
Package completed successfully.');
END;
Email with Multiple Features (attachments, priority, CC):
BEGIN
BEGIN
LET my_package_Send_Mail_Task_integration_sql STRING := 'CREATE OR REPLACE NOTIFICATION INTEGRATION my_package_Send_Mail_Task
TYPE=EMAIL
ENABLED=TRUE
ALLOWED_RECIPIENTS=("noreply@company.com", "admin@example.com", "team@example.com")';
EXECUTE IMMEDIATE :my_package_Send_Mail_Task_integration_sql;
END;
!!!RESOLVE EWI!!! /*** SSC-EWI-SSIS0015 - SNOWFLAKE'S SYSTEM$SEND_EMAIL DOES NOT SUPPORT FILE ATTACHMENTS. CONSIDER USING STAGED FILES WITH SHARED LINKS OR ALTERNATIVE DELIVERY METHODS. ***/!!!
!!!RESOLVE EWI!!! /*** SSC-EWI-SSIS0016 - EMAIL PRIORITY SETTINGS (HIGH/NORMAL/LOW) ARE NOT SUPPORTED BY SYSTEM$SEND_EMAIL AND WILL BE IGNORED. ***/!!!
--** SSC-FDM-SSIS0008 - SNOWFLAKE'S EMAIL INTEGRATION USES A FIXED SENDER ADDRESS. THE ORIGINAL FROM ADDRESS HAS BEEN PREPENDED TO THE MESSAGE BODY FOR REFERENCE. **
--** SSC-FDM-SSIS0009 - SNOWFLAKE'S SYSTEM$SEND_EMAIL DOES NOT SUPPORT CC ADDRESSING. ALL CC RECIPIENTS HAVE BEEN ADDED TO THE MAIN RECIPIENTS LIST. **
CALL SYSTEM$SEND_EMAIL('my_package_Send_Mail_Task', 'noreply@company.com,admin@example.com,team@example.com', 'Monthly Report', 'Email sent by: noreply@company.com
Please review the attached monthly report.');
END;
Prerequisites for Snowflake Email¶
Before using converted Send Mail Tasks:
Email Notification Integration permissions: Account admin must grant
CREATE INTEGRATION ON ACCOUNTto the executing roleRecipient verification: All email addresses in
ALLOWED_RECIPIENTSmust be verified in SnowflakeUpdate 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:
-- Upload file to stage
PUT file://report.pdf @my_stage;
-- Get shareable link (valid for 1 hour)
LET file_url STRING := GET_PRESIGNED_URL(@my_stage, 'report.pdf', 3600);
-- Include link in email body
CALL SYSTEM$SEND_EMAIL('my_integration', 'admin@example.com', 'Report Available',
'Download the report from: ' || :file_url);
BCC Privacy:
Send separate emails to maintain recipient privacy:
-- Send to main recipients
CALL SYSTEM$SEND_EMAIL('my_integration', 'admin@example.com', 'Subject', 'Message');
-- Send separately to BCC recipients
CALL SYSTEM$SEND_EMAIL('my_integration', 'audit@example.com', 'Subject', 'Message');
dbt Project Execution¶
Within the orchestration code, Data Flow Tasks are executed using Snowflake’s EXECUTE DBT PROJECT command:
EXECUTE DBT PROJECT schema.project_name ARGS='build --target dev'
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_nameSnowflake 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:
Component |
Category |
dbt Mapping |
Model Naming |
Notes |
|---|---|---|---|---|
Source Components |
||||
Source |
Staging Model |
|
- |
|
Source |
Staging Model |
|
- |
|
Transformation Components |
||||
Transformation |
Intermediate Model (SELECT with expressions) |
|
- |
|
Transformation |
Intermediate Model (CAST expressions) |
|
- |
|
Transformation |
Intermediate Model (LEFT JOIN) |
|
Might present functional differences for ORDER BY requirements. Check FDM SSC-FDM-SSIS0001 for more information |
|
Transformation |
Intermediate Model (UNION ALL) |
|
- |
|
Transformation |
Intermediate Model (UNION ALL) |
|
Might present functional differences for sorted output. Check FDM SSC-FDM-SSIS0002 for more information |
|
Transformation |
Intermediate Model (JOIN) |
|
Might present functional differences for ORDER BY requirements. Check FDM SSC-FDM-SSIS0004 for more information |
|
Transformation |
Intermediate Model (Router pattern with CTEs) |
|
- |
|
Transformation |
Intermediate Model (SELECT pass-through) |
|
- |
|
Transformation |
Intermediate Model with macro |
|
Uses m_update_row_count_variable macro |
|
Destination Components |
||||
Destination |
Mart Model (table) |
|
- |
|
Destination |
Mart Model (table) |
|
- |
Note: Unlisted Data Flow components generate EWI SSC-EWI-SSIS0001.