Get started with the SSIS importer
The SSIS importer is about to be released as open source (Apache License 2.0). Until then, we run it for you: contact us.
In this tutorial you install the importer in Apache Hop, import a public SSIS project of nine packages, read the migration report, and run one of the converted packages against a SQL Server in Docker. It takes about half an hour, most of it downloading SQL Server.
The project is the MSBI training labs by Amit Naik, published on GitHub under the MIT licence: a project in the project deployment model, with a project connection manager, a master package that runs five child packages, flat files loaded into dimensions, and two Slowly Changing Dimensions. Nothing you need comes from Microsoft apart from the SQL Server container image, and no step needs Windows or SSIS.
Before you start
- Apache Hop 2.19.0 or later. See Install Apache Hop.
- Java 21, which Hop 2.19 needs anyway.
git.- Docker, for the SQL Server the converted package writes to in step 5. SQL Server images are x64 only; on Apple Silicon, Docker Desktop runs them through Rosetta.
In the commands below, <hop> is the folder Hop is installed in. Run them all from the same
folder: Hop's scripts need full paths, so the commands use $PWD.
1. Install the plugin
Download importer-ssis-<version>.zip from the
importer's releases, once published, and
unzip it into the Hop folder. The zip holds a plugins/ folder, so it lands in the right place:
unzip importer-ssis-<version>.zip -d <hop>
Start Hop GUI (or restart it). The File menu now has Import from SSIS….
2. Get the SSIS project
git clone https://github.com/Amitpnk/MSBI-Project.git msbi
The packages are in msbi/SSIS_Project/, next to the project connection manager
Global_ConnectionString.conmgr and Project.params; the sample data is in msbi/DataFile/.
3. Import it
<hop>/hop-import.sh -t ssis -i "$PWD/msbi/SSIS_Project" -o "$PWD/msbi-to-hop"
You can do the same from File → Import from SSIS… in Hop GUI: the dialog has the same options.
Expected result: the log says
Found 9 SSIS package(s) in 1 project folder(s) under …/msbi/SSIS_Project
SSIS import: 9 package(s) converted, 0 failed, 22 file(s) written.
and msbi-to-hop/ holds:
- nine workflows, one per package:
Country.hwf,FactCustomer.hwf,Lab1.hwf,Lab2.hwf,Lab3.hwf,Main.hwf,Product.hwf,SalesPerson.hwf,States.hwf; - a folder per package with its pipelines, one per Data Flow Task (
Lab1/Load CSV.hpl, …), and inLab3/the workflow and pipelines of its Foreach Loop; metadata/rdbms/: three connections, one per database connection manager, among themGlobal_ConnectionString.jsonfor the project connection manager;metadata/pipeline-run-configuration/andmetadata/workflow-run-configuration/: thelocalrun configurations;ssis-migration-report.md.
There is no environments/ folder: this project's Project.params has no parameters.
4. Read the report
Open msbi-to-hop/ssis-migration-report.md. With importer 0.1.0, its Totals are:
| Metric | Count |
|---|---|
| Jobs | 9 |
| Components | 60 |
| AUTO | 58 |
| PARTIAL | 2 |
| MANUAL | 0 |
| UNSUPPORTED | 0 |
| Flagged for review | 2 |
A "job" in the report is a package; a component is a task, a container or a data flow component. The other sections tell you where the work is:
- Per job: components and flagged components for each package. Seven of the nine have
0in the last column. - Most frequent source components: what the project is made of. Here, flat file sources, Derived Columns, ADO.NET destinations and Execute Package Tasks.
- Needs review: the two flagged components. In
Lab2andLab3, a Data Conversion sends its failing rows to an error output that writes a file; the converted Data Conversion has no error handling, so those rows are not routed there. - Database connections: the three connections, and what to do on each. All three use Windows
authentication, and two are renamed, because
AMIT-PC\SQLEXPRESS.CustomerDatawareHouseis not a valid file name. - Hop settings:
HOP_EMPTY_STRING_DIFFERS_FROM_NULL=Y, which every SSIS migration needs, and how the Slowly Changing Dimensions inCountryandProductmatch keys.
These figures describe this project, which is made of training labs with no Script Tasks or Script Components. Your own project will have its own; see why there is no conversion rate.
5. Run one package
Lab1 reads a CSV file of customers, upper-cases their names in a Derived Column, and writes them
to the table tblCustomer in the CustomerDatawareHouse database. See it next to the original in
Before and after.
-
Start a SQL Server and create the database and the table. The repository ships no SQL; the table has the columns the package writes:
docker run -d --name msbi-sql -p 1433:1433 --platform linux/amd64 \
-e ACCEPT_EULA=Y -e MSSQL_PID=Developer -e 'MSSQL_SA_PASSWORD=Hop!Tutorial1' \
mcr.microsoft.com/mssql/server:2022-latestWait until
docker logs msbi-sqlsaysSQL Server is now ready for client connections, then:docker exec msbi-sql /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P 'Hop!Tutorial1' \
-Q "CREATE DATABASE CustomerDatawareHouse;"
docker exec msbi-sql /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P 'Hop!Tutorial1' \
-d CustomerDatawareHouse -Q "CREATE TABLE dbo.tblCustomer (CustomerCode nvarchar(50) NULL,
CustomerName nvarchar(50) NULL, CustomerAmount decimal(18,2) NULL, SalesDate datetime NULL);" -
Make the output folder a Hop project, so Hop finds the connections in its
metadata/folder:<hop>/hop-conf.sh -pc -p msbi -ph "$PWD/msbi-to-hop" -
In Hop GUI, select the project
msbi. In the Metadata perspective, open the relational database connectionAMIT-PC_SQLEXPRESS.CustomerDatawareHouse, set Server host name tolocalhost, Username tosaand Password toHop!Tutorial1, and click Test. The package was built for Windows authentication on the author's own machine; this replaces it with a SQL login on yours. -
Open
Lab1/Load CSV.hpl. InRead from CSV (Flat File Source), set the file name to the full path ofmsbi/DataFile/Lab1.txt: the package readsD:\Questpond\MSBI\Practice\MSBI\DataFile\Lab1.txt, and the importer keeps paths as they are. Save the pipeline. -
Run the package's workflow, with the setting the report asks for:
<hop>/hop-run.sh -j msbi -f "$PWD/msbi-to-hop/Lab1.hwf" -r local \
-s HOP_EMPTY_STRING_DIFFERS_FROM_NULL=Y
Expected result: the workflow finishes without errors, and the log shows the ten rows of the file going through:
Read from CSV (Flat File Source).0 - Finished processing (I=11, O=0, R=0, W=10, U=0, E=0)
Customer data ware house (ADO NET Destination).0 - Finished processing (I=0, O=10, R=10, W=10, U=0, E=0)
Check the table:
docker exec msbi-sql /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P 'Hop!Tutorial1' \
-d CustomerDatawareHouse -Q "SELECT CustomerCode, CustomerName, CustomerAmount FROM dbo.tblCustomer"
It holds ten customers, 1001 to 1010, with their names in capitals (AMIT, SHWETHA, …) and
their amounts (100.23, 300.00, …).
When you are done, docker rm -f msbi-sql removes the SQL Server.
Next
- Before and after: this package and its Hop workflow and pipeline side by side.
- Assess an SSIS project: do the same on your own packages.
- Validate a migration: prove a converted package matches the original.