diff --git a/.gitignore b/.gitignore
index 07d9537..c4b1b02 100644
--- a/.gitignore
+++ b/.gitignore
@@ -350,3 +350,4 @@ MigrationBackup/
.ionide/
.vscode/settings.json
.DS_Store
+/tSQLtSSISTemplate/TemplateSSIS/*.database
diff --git a/tSQLtSSISTemplate/ReferenceObjects/PrepareServer.sql b/tSQLtSSISTemplate/ReferenceObjects/PrepareServer.sql
new file mode 100644
index 0000000..7033052
--- /dev/null
+++ b/tSQLtSSISTemplate/ReferenceObjects/PrepareServer.sql
@@ -0,0 +1,191 @@
+IF OBJECT_ID('tempdb..#Private_GetAssemblyKeyBytes') IS NOT NULL DROP PROCEDURE #Private_GetAssemblyKeyBytes;
+GO
+CREATE PROCEDURE #Private_GetAssemblyKeyBytes
+ @AssemblyKeyBytes VARBINARY(MAX) = NULL OUTPUT,
+ @AssemblyKeyThumbPrint VARBINARY(MAX) = NULL OUTPUT
+AS
+ SELECT @AssemblyKeyBytes =
+0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062+
+0x652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C01030000FEC6610000000000000000E00022200B013000000A0000000600000000000042280000002000000040000000000010002000000002000004000000000000+
+0x000400000000000000008000000002000077FF0000030040850000100000100000000010000010000000000000100000000000000000000000F02700004F00000000400000A003000000000000000000000000000000000000006000000C000000B82600+
+0x001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E746578740000004808000000200000000A0000000200+
+0x00000000000000000000000000200000602E72737263000000A00300000040000000040000000C0000000000000000000000000000400000402E72656C6F6300000C00000000600000000200000010000000000000000000000000000040000042000000+
+0x000000000000000000000000002428000000000000480000000200050058200000E005000009000000000000000000000000000000382600008000000000000000000000000000000000000000000000000000000000000000000000001E02280F00000A+
+0x2A42534A4201000100000000000C00000076322E302E35303732370000000005006C000000A8010000237E0000140200002C02000023537472696E67730000000040040000040000002355530044040000100000002347554944000000540400008C0100+
+0x0023426C6F620000000000000002000001471400000900000000FA013300160000010000001000000002000000010000000F0000000E0000000100000001000000000078010100000000000600ED00DE0106005A01DE0106002100AC010F00FE01000006+
+0x00490094010600D00094010600B100940106004101940106000D01940106002601940106007900940106003500BF0106001300BF0106009400940106006000940106000D028D010000000001000000000001000100000010002502140241000100010050+
+0x20000000008618A601060001000900A60101001100A60106001900A6010A002900A60110003100A60110003900A60110004100A60110004900A60110005100A60110005900A60110006100A60115006900A60110007100A60110007900A60110008100A6+
+0x0106002E000B00C5002E001300CE002E001B00ED002E002300F6002E002B000C012E0033000C012E003B000C012E00430012012E004B001D012E0053000C012E005B000C012E00630035012E006B005F012E0073006C0104800000010000000000000001+
+0x0000002300140200000200000000000000000000001A000A000000000000000000003C4D6F64756C653E006D73636F726C696200477569644174747269627574650044656275676761626C6541747472696275746500436F6D56697369626C6541747472+
+0x696275746500417373656D626C795469746C6541747472696275746500417373656D626C794B65794E616D6541747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7946696C6556657273696F6E+
+0x41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C794465736372697074696F6E41747472696275746500436F6D70696C6174696F6E52656C61786174696F6E734174747269627574+
+0x6500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C79436F6D70616E794174747269627574650052756E74696D65436F6D7061746962696C69747941+
+0x7474726962757465007453514C74417373656D626C794B65792E646C6C0053797374656D0053797374656D2E5265666C656374696F6E002E63746F720053797374656D2E446961676E6F73746963730053797374656D2E52756E74696D652E496E746572+
+0x6F7053657276696365730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300446562756767696E674D6F646573004F626A656374007453514C74417373656D626C794B657900656D707479000000000000267A3D3EFF6D06+
+0x43A8941A157D8B705800042001010803200001052001011111042001010E042001010208B77A5C561934E08980A00024000004800000940000000602000000240000525341310004000001000100B9AF416AD8DFEDEC08A5652FA257F1242BF4ED60EF5A+
+0x7B84A429604D62C919C5663A9C7710A7C5DF9953B69EC89FCE85D71E051140B273F4C9BF890A2BC19C48F22D7B1F1D739F90EEBC5729555F7F8B63ED088BBB083B336F7E38B92D44CFE1C842F09632B85114772FF2122BC638C78D497C4E88C2D656C166+
+0x050D6E1EF3940801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301080100020000000000150100107453514C74417373656D626C794B657900000501000000000A0100057453514C74000017010012436F+
+0x7079726967687420C2A920203230313900002901002430333536303035622D373166642D346466332D383530322D32376336613630366539653800000C010007312E302E302E3000001D0100187453514C745F4F6666696369616C5369676E696E674B65+
+0x79000000005642725AAE45AE4D87E0D4C4F71412AE67BB189E365C03DA200721B8B9860E54DB1F44DDE09808DFA92D492263E9A97001DB32AB614DB4F0211728EC4F120FF4D449F72882BED8AF6FC8597C551F71365CAF85A1229F299BF3A358BFADD10A+
+0x9A9E50F97628A049B6CCF965B33BF61775545C368D1BAEB095DFFA5AA46D22945F0000000000FEC66100000000020000001C010000D4260000D4080000525344536DC8DF27864EE14292C9ACAF39850C6901000000443A5C615C315C7453514C745C7453+
+0x514C74434C525C7453514C74417373656D626C794B65795C6F626A5C437275697365436F6E74726F6C5C7453514C74417373656D626C794B65792E7064620000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001828000000000000000000003228000000200000000000000000000000000000000000000000000024280000000000000000000000005F+
+0x436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001000000018000080000000+
+0x00000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000440300000000000000000000440334000000560053005F00560045005200530049004F004E005F0049004E0046004F00000000+
+0x00BD04EFFE00000100000001000000000000000100000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073+
+0x006C006100740069006F006E00000000000000B004A4020000010053007400720069006E006700460069006C00650049006E0066006F0000008002000001003000300030003000300034006200300000001A000100010043006F006D006D0065006E0074+
+0x00730000000000000022000100010043006F006D00700061006E0079004E0061006D00650000000000000000004A0011000100460069006C0065004400650073006300720069007000740069006F006E00000000007400530051004C0074004100730073+
+0x0065006D0062006C0079004B006500790000000000300008000100460069006C006500560065007200730069006F006E000000000031002E0030002E0030002E00300000004A001500010049006E007400650072006E0061006C004E0061006D00650000+
+0x007400530051004C00740041007300730065006D0062006C0079004B00650079002E0064006C006C00000000004800120001004C006500670061006C0043006F007000790072006900670068007400000043006F00700079007200690067006800740020+
+0x00A90020002000320030003100390000002A00010001004C006500670061006C00540072006100640065006D00610072006B00730000000000000000005200150001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000+
+0x007400530051004C00740041007300730065006D0062006C0079004B00650079002E0064006C006C00000000002C0006000100500072006F0064007500630074004E0061006D006500000000007400530051004C0074000000340008000100500072006F+
+0x006400750063007400560065007200730069006F006E00000031002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0030002E0030000000000000+
+0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000+
+0x000C0000004438000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+
+0x000000000000000000
+ ,@AssemblyKeyThumbPrint = 0xE8FFF6F136D7B53E ;
+GO
+IF OBJECT_ID('tempdb..#Private_EnableCLR') IS NOT NULL DROP PROCEDURE #Private_EnableCLR;
+GO
+CREATE PROCEDURE #Private_EnableCLR
+AS
+BEGIN
+ EXEC master.sys.sp_configure @configname='clr enabled', @configvalue = 1;
+ RECONFIGURE;
+END;
+GO
+IF OBJECT_ID('tempdb..#Private_GetSQLProductMajorVersion') IS NOT NULL DROP PROCEDURE #Private_GetSQLProductMajorVersion;
+GO
+CREATE PROCEDURE #Private_GetSQLProductMajorVersion
+AS
+ RETURN CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS NVARCHAR(MAX)),4) AS INT);
+GO
+DECLARE @Version INT;
+EXEC @Version = #Private_GetSQLProductMajorVersion;
+PRINT @Version;
+GO
+IF OBJECT_ID('tempdb..#RemoveAssemblyKey') IS NOT NULL DROP PROCEDURE #RemoveAssemblyKey;
+GO
+CREATE PROCEDURE #RemoveAssemblyKey
+AS
+BEGIN
+ IF(NOT EXISTS(SELECT * FROM sys.fn_my_permissions(NULL,'server') AS FMP WHERE FMP.permission_name = 'CONTROL SERVER'))
+ BEGIN
+ RAISERROR('Only principals with CONTROL SERVER permission can execute this procedure.',16,10);
+ RETURN -1;
+ END;
+ DECLARE @master_sys_sp_executesql NVARCHAR(MAX); SET @master_sys_sp_executesql = 'master.sys.sp_executesql';
+ DECLARE @ProductMajorVersion INT;
+ EXEC @ProductMajorVersion = #Private_GetSQLProductMajorVersion;
+ IF SUSER_ID('tSQLtAssemblyKey') IS NOT NULL DROP LOGIN tSQLtAssemblyKey;
+ EXEC @master_sys_sp_executesql N'IF ASYMKEY_ID(''tSQLtAssemblyKey'') IS NOT NULL DROP ASYMMETRIC KEY tSQLtAssemblyKey;';
+ EXEC @master_sys_sp_executesql N'IF EXISTS(SELECT * FROM sys.assemblies WHERE name = ''tSQLtAssemblyKey'') DROP ASSEMBLY tSQLtAssemblyKey;';
+ DECLARE @cmd NVARCHAR(MAX);
+ IF(@ProductMajorVersion>=14)
+ BEGIN
+ DECLARE @TrustedHash NVARCHAR(MAX);
+ DECLARE @AssemblyKeyBytes VARBINARY(MAX);
+ EXEC #Private_GetAssemblyKeyBytes @AssemblyKeyBytes = @AssemblyKeyBytes OUT;
+ SELECT @TrustedHash = CONVERT(NVARCHAR(MAX),HASHBYTES('SHA2_512',@AssemblyKeyBytes),1);
+ SELECT @cmd =
+ 'IF EXISTS(SELECT 1 FROM sys.trusted_assemblies WHERE hash = ' + @TrustedHash +' AND description = ''tSQLt Ephemeral'')'+
+ 'EXEC sys.sp_drop_trusted_assembly @hash = ' + @TrustedHash + ';';
+ EXEC master.sys.sp_executesql @cmd;
+ END;
+END;
+GO
+IF OBJECT_ID('tempdb..#InstallAssemblyKey') IS NOT NULL DROP PROCEDURE #InstallAssemblyKey;
+GO
+CREATE PROCEDURE #InstallAssemblyKey
+AS
+BEGIN
+ IF(NOT EXISTS(SELECT * FROM sys.fn_my_permissions(NULL,'server') AS FMP WHERE FMP.permission_name = 'CONTROL SERVER'))
+ BEGIN
+ RAISERROR('Only principals with CONTROL SERVER permission can execute this procedure.',16,10);
+ RETURN -1;
+ END;
+ DECLARE @cmd NVARCHAR(MAX);
+ DECLARE @cmd2 NVARCHAR(MAX);
+ DECLARE @master_sys_sp_executesql NVARCHAR(MAX); SET @master_sys_sp_executesql = 'master.sys.sp_executesql';
+ DECLARE @ProductMajorVersion INT;
+ EXEC @ProductMajorVersion = #Private_GetSQLProductMajorVersion;
+ DECLARE @AssemblyKeyBytes VARBINARY(MAX),
+ @AssemblyKeyThumbPrint VARBINARY(MAX);
+ EXEC #Private_GetAssemblyKeyBytes @AssemblyKeyBytes OUT, @AssemblyKeyThumbPrint OUT;
+ SET @cmd = 'IF EXISTS(SELECT * FROM sys.assemblies WHERE name = ''tSQLtAssemblyKey'') DROP ASSEMBLY tSQLtAssemblyKey;';
+ EXEC @master_sys_sp_executesql @cmd;
+ SET @cmd2 = 'SELECT @cmd = ''DROP ASSEMBLY ''+QUOTENAME(A.name)+'';'''+
+ ' FROM master.sys.assemblies AS A'+
+ ' WHERE A.clr_name LIKE ''tsqltassemblykey, %'';';
+ EXEC sys.sp_executesql @cmd2,N'@cmd NVARCHAR(MAX) OUTPUT',@cmd OUT;
+ EXEC @master_sys_sp_executesql @cmd;
+ DECLARE @Hash VARBINARY(64) = NULL;
+ IF(@ProductMajorVersion>=14)
+ BEGIN
+ SELECT @Hash = HASHBYTES('SHA2_512',@AssemblyKeyBytes);
+ SELECT @cmd =
+ 'IF NOT EXISTS (SELECT * FROM sys.trusted_assemblies WHERE [hash] = @Hash)'+
+ 'BEGIN'+
+ ' EXEC sys.sp_add_trusted_assembly @hash = @Hash, @description = N''tSQLt Ephemeral'';'+
+ 'END ELSE BEGIN'+
+ ' SELECT @Hash = NULL FROM sys.trusted_assemblies WHERE [hash] = @Hash AND description <> ''tSQLt Ephemeral'';'+
+ 'END;';
+ EXEC @master_sys_sp_executesql @cmd, N'@Hash VARBINARY(64) OUTPUT',@Hash OUT;
+ END;
+ SELECT @cmd =
+ 'CREATE ASSEMBLY tSQLtAssemblyKey AUTHORIZATION dbo FROM ' +
+ CONVERT(NVARCHAR(MAX),@AssemblyKeyBytes,1) +
+ ' WITH PERMISSION_SET = SAFE;'
+ EXEC @master_sys_sp_executesql @cmd;
+ IF SUSER_ID('tSQLtAssemblyKey') IS NOT NULL DROP LOGIN tSQLtAssemblyKey;
+ SET @cmd = N'IF ASYMKEY_ID(''tSQLtAssemblyKey'') IS NOT NULL DROP ASYMMETRIC KEY tSQLtAssemblyKey;';
+ EXEC @master_sys_sp_executesql @cmd;
+ SET @cmd2 = 'SELECT @cmd = ISNULL(''DROP LOGIN ''+QUOTENAME(SP.name)+'';'','''')+''DROP ASYMMETRIC KEY '' + QUOTENAME(AK.name) + '';'''+
+ ' FROM master.sys.asymmetric_keys AS AK'+
+ ' LEFT JOIN master.sys.server_principals AS SP'+
+ ' ON AK.sid = SP.sid'+
+ ' WHERE AK.thumbprint = @AssemblyKeyThumbPrint;';
+ EXEC sys.sp_executesql @cmd2,N'@cmd NVARCHAR(MAX) OUTPUT, @AssemblyKeyThumbPrint VARBINARY(MAX)',@cmd OUT, @AssemblyKeyThumbPrint;
+ EXEC @master_sys_sp_executesql @cmd;
+ SET @cmd = 'CREATE ASYMMETRIC KEY tSQLtAssemblyKey FROM ASSEMBLY tSQLtAssemblyKey;';
+ EXEC @master_sys_sp_executesql @cmd;
+ SET @cmd = 'CREATE LOGIN tSQLtAssemblyKey FROM ASYMMETRIC KEY tSQLtAssemblyKey;';
+ EXEC @master_sys_sp_executesql @cmd;
+ SET @cmd = 'DROP ASSEMBLY tSQLtAssemblyKey;';
+ EXEC @master_sys_sp_executesql @cmd;
+ IF(@Hash IS NOT NULL)
+ BEGIN
+ SELECT @cmd = 'EXEC sys.sp_drop_trusted_assembly @hash = @Hash;';
+ EXEC @master_sys_sp_executesql @cmd, N'@Hash VARBINARY(64)',@Hash;
+ END;
+ IF(@ProductMajorVersion>=14)
+ BEGIN
+ SET @cmd = 'GRANT UNSAFE ASSEMBLY TO tSQLtAssemblyKey;';
+ END
+ ELSE
+ BEGIN
+ SET @cmd = 'GRANT EXTERNAL ACCESS ASSEMBLY TO tSQLtAssemblyKey;';
+ END;
+ EXEC @master_sys_sp_executesql @cmd;
+END;
+GO
+IF OBJECT_ID('tempdb..#PrepareServer') IS NOT NULL DROP PROCEDURE #PrepareServer;
+GO
+CREATE PROCEDURE #PrepareServer
+AS
+BEGIN
+ EXEC #Private_EnableCLR;
+ EXEC #InstallAssemblyKey;
+END;
+GO
+EXEC #PrepareServer;
+GO
diff --git a/tSQLtSSISTemplate/ReferenceObjects/ReferenceObjects.sqlproj b/tSQLtSSISTemplate/ReferenceObjects/ReferenceObjects.sqlproj
new file mode 100644
index 0000000..18830e8
--- /dev/null
+++ b/tSQLtSSISTemplate/ReferenceObjects/ReferenceObjects.sqlproj
@@ -0,0 +1,60 @@
+
+
+
+ Debug
+ AnyCPU
+ ReferenceObjects
+ 2.0
+ 4.1
+ {7de3b0bc-090a-4ce6-a691-23291168b692}
+ Microsoft.Data.Tools.Schema.Sql.Sql150DatabaseSchemaProvider
+ Database
+
+
+ ReferenceObjects
+ ReferenceObjects
+ 1033, CI
+ BySchemaAndSchemaType
+ True
+ v4.5
+ CS
+ Properties
+ False
+ True
+ True
+
+
+ bin\Release\
+ $(MSBuildProjectName).sql
+ False
+ pdbonly
+ true
+ false
+ true
+ prompt
+ 4
+
+
+ bin\Debug\
+ $(MSBuildProjectName).sql
+ false
+ true
+ full
+ false
+ true
+ true
+ prompt
+ 4
+
+
+ 11.0
+
+ True
+ 11.0
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/ReferenceObjects/tSQLt.2019.dacpac b/tSQLtSSISTemplate/ReferenceObjects/tSQLt.2019.dacpac
new file mode 100644
index 0000000..9d0101e
Binary files /dev/null and b/tSQLtSSISTemplate/ReferenceObjects/tSQLt.2019.dacpac differ
diff --git a/tSQLtSSISTemplate/TemplateDatabase/SSISObjects.TransformObjectList_GetObjects.sql b/tSQLtSSISTemplate/TemplateDatabase/SSISObjects.TransformObjectList_GetObjects.sql
new file mode 100644
index 0000000..bc9b148
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateDatabase/SSISObjects.TransformObjectList_GetObjects.sql
@@ -0,0 +1,9 @@
+CREATE VIEW SSISObjects.TransformObjectList_GetObjects
+AS
+SELECT
+ name,
+ SCHEMA_NAME(schema_id) SchemaName,
+ QUOTENAME(SCHEMA_NAME(schema_id)) QuotedSchemaName,
+ QUOTENAME(name) QuotedName
+ FROM sys.objects;
+GO
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateDatabase/SSISObjects.sql b/tSQLtSSISTemplate/TemplateDatabase/SSISObjects.sql
new file mode 100644
index 0000000..7fba24a
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateDatabase/SSISObjects.sql
@@ -0,0 +1,2 @@
+CREATE SCHEMA SSISObjects;
+
diff --git a/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj b/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj
new file mode 100644
index 0000000..dd7489c
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj
@@ -0,0 +1,72 @@
+
+
+
+ Debug
+ AnyCPU
+ TemplateDatabase
+ 2.0
+ 4.1
+ {23a6e107-9ab3-4f27-8365-1c5c19147e94}
+ Microsoft.Data.Tools.Schema.Sql.Sql150DatabaseSchemaProvider
+ Database
+
+
+ TemplateDatabase
+ TemplateDatabase
+ 1033, CI
+ BySchemaAndSchemaType
+ True
+ v4.5
+ CS
+ Properties
+ False
+ True
+ True
+
+
+ bin\Release\
+ $(MSBuildProjectName).sql
+ False
+ pdbonly
+ true
+ false
+ true
+ prompt
+ 4
+
+
+ bin\Debug\
+ $(MSBuildProjectName).sql
+ false
+ true
+ full
+ false
+ true
+ true
+ prompt
+ 4
+
+
+ 11.0
+
+ True
+ 11.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\150\SqlSchemas\master.dacpac
+ False
+ master
+
+
+
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateDatabase/TransformedObjectList.sql b/tSQLtSSISTemplate/TemplateDatabase/TransformedObjectList.sql
new file mode 100644
index 0000000..5a18d01
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateDatabase/TransformedObjectList.sql
@@ -0,0 +1,8 @@
+CREATE TABLE [dbo].[TransformedObjectList]
+(
+ [name] nvarchar(128),
+ [SchemaName] nvarchar(128),
+ [QuotedSchemaName] nvarchar(258),
+ [QuotedName] nvarchar(258),
+ [QuotedFullName] nvarchar(517)
+)
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj b/tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj
new file mode 100644
index 0000000..29d89ea
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj
@@ -0,0 +1,85 @@
+
+
+
+ Debug
+ AnyCPU
+ TemplateDatabaseTests
+ 2.0
+ 4.1
+ {2c86a7b1-bd0e-4aa2-aaa6-9df8b515df2a}
+ Microsoft.Data.Tools.Schema.Sql.Sql150DatabaseSchemaProvider
+ Database
+
+
+ TemplateDatabaseTests
+ TemplateDatabaseTests
+ 1033, CI
+ BySchemaAndSchemaType
+ True
+ v4.5
+ CS
+ Properties
+ False
+ True
+ True
+
+
+ bin\Release\
+ $(MSBuildProjectName).sql
+ False
+ pdbonly
+ true
+ false
+ true
+ prompt
+ 4
+
+
+ bin\Debug\
+ $(MSBuildProjectName).sql
+ false
+ true
+ full
+ false
+ true
+ true
+ prompt
+ 4
+
+
+ 11.0
+
+ True
+ 11.0
+
+
+
+
+
+
+
+
+ ..\ReferenceObjects\tSQLt.2019.dacpac
+ False
+
+
+ $(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\150\SqlSchemas\master.dacpac
+ False
+ master
+
+
+
+
+ TemplateDatabase
+ $(SqlCmdVar__1)
+
+
+
+
+ TemplateDatabase
+ {23a6e107-9ab3-4f27-8365-1c5c19147e94}
+ True
+ False
+
+
+
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateSSIS.CI/App.config b/tSQLtSSISTemplate/TemplateSSIS.CI/App.config
new file mode 100644
index 0000000..56efbc7
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS.CI/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateSSIS.CI/CreateSSISFolder.sql b/tSQLtSSISTemplate/TemplateSSIS.CI/CreateSSISFolder.sql
new file mode 100644
index 0000000..bc6cc69
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS.CI/CreateSSISFolder.sql
@@ -0,0 +1,4 @@
+DECLARE @folder_id BIGINT
+EXEC [SSISDB].[catalog].[create_folder] @folder_name=N'TestFolder', @folder_id=@folder_id OUTPUT
+SELECT @folder_id
+EXEC [SSISDB].[catalog].[set_folder_description] @folder_name=N'TestFolder', @folder_description=N'Ephemeral folder for testing!'
diff --git a/tSQLtSSISTemplate/TemplateSSIS.CI/DeleteSSISFolder.sql b/tSQLtSSISTemplate/TemplateSSIS.CI/DeleteSSISFolder.sql
new file mode 100644
index 0000000..0ba3670
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS.CI/DeleteSSISFolder.sql
@@ -0,0 +1,28 @@
+(MAX) = 'TestFolder';
+DECLARE @cmd NVARCHAR(MAX) =
+ISNULL(
+ (
+ SELECT 'EXEC [SSISDB].[catalog].[delete_project] @project_name=N'''+P.name+''',@folder_name=N'''+F.name+''';'
+ FROM SSISDB.catalog.folders AS F
+ JOIN SSISDB.catalog.projects AS P
+ ON P.folder_id = F.folder_id
+ WHERE F.name = @FolderName
+ FOR XML PATH(''),TYPE
+ ).value('.','NVARCHAR(MAX)')
+,'') +
+ISNULL(
+ (
+ SELECT 'EXEC [SSISDB].[catalog].[delete_environment] @environment_name=N'''+E.name+''',@folder_name=N'''+F.name+''';'
+ FROM SSISDB.catalog.folders AS F
+ JOIN SSISDB.catalog.environments AS E
+ ON E.folder_id = F.folder_id
+ WHERE F.name = @FolderName
+ FOR XML PATH(''),TYPE
+ ).value('.','NVARCHAR(MAX)')
+,'') +
+(SELECT 'EXEC [SSISDB].[catalog].[delete_folder] @folder_name=N'''+F.name+''';'
+ FROM SSISDB.catalog.folders AS F
+ WHERE F.name = @FolderName);
+
+--PRINT @cmd
+EXEC(@cmd);
diff --git a/tSQLtSSISTemplate/TemplateSSIS.CI/DeploySSIS.ps1 b/tSQLtSSISTemplate/TemplateSSIS.CI/DeploySSIS.ps1
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS.CI/DeploySSIS.ps1
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateSSIS.CI/Properties/AssemblyInfo.cs b/tSQLtSSISTemplate/TemplateSSIS.CI/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..619927c
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS.CI/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("TemplateSSIS.CI")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("TemplateSSIS.CI")]
+[assembly: AssemblyCopyright("Copyright © 2021")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("52efcc53-d796-4c8d-85e7-43da7a3ffced")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/tSQLtSSISTemplate/TemplateSSIS.CI/SetVariableValues.sql b/tSQLtSSISTemplate/TemplateSSIS.CI/SetVariableValues.sql
new file mode 100644
index 0000000..24df026
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS.CI/SetVariableValues.sql
@@ -0,0 +1,20 @@
+EXEC [SSISDB].[catalog].[create_environment] @environment_name=N'TemplateSSIS', @environment_description=N'', @folder_name=N'TestFolder.ref'
+GO
+DECLARE @var sql_variant = N'Data Source=.,41419;User ID=tSQLt.Build.SSIS;Initial Catalog=tSQLt_Dev;Provider=SQLNCLI11.1;Application Name=SourceDBConnection;Auto Translate=False; '
+EXEC [SSISDB].[catalog].[create_environment_variable] @variable_name=N'SourceDB_ConnectionString', @sensitive=False, @description=N'', @environment_name=N'TemplateSSIS', @folder_name=N'TestFolder.ref', @value=@var, @data_type=N'String'
+GO
+DECLARE @var sql_variant = N'Data Source=.,41419;User ID=tSQLt.Build.SSIS;Initial Catalog=tSQLt_Dev;Provider=SQLNCLI11.1;Application Name=TargetDBConnection;Auto Translate=False; '
+EXEC [SSISDB].[catalog].[create_environment_variable] @variable_name=N'TargetDB_ConnectionString', @sensitive=False, @description=N'', @environment_name=N'TemplateSSIS', @folder_name=N'TestFolder.ref', @value=@var, @data_type=N'String'
+GO
+DECLARE @var SQL_VARIANT = N''
+EXEC [SSISDB].[catalog].[create_environment_variable] @variable_name=N'SourceDB_Password', @sensitive=True, @description=N'', @environment_name=N'TemplateSSIS', @folder_name=N'TestFolder.ref', @value=@var, @data_type=N'String'
+GO
+DECLARE @var SQL_VARIANT = N''
+EXEC [SSISDB].[catalog].[create_environment_variable] @variable_name=N'TargetDB_Password', @sensitive=True, @description=N'', @environment_name=N'TemplateSSIS', @folder_name=N'TestFolder.ref', @value=@var, @data_type=N'String'
+GO
+
+GO
+
+
+GO
+
diff --git a/tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj b/tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj
new file mode 100644
index 0000000..d803a3e
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj
@@ -0,0 +1,59 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED}
+ Library
+ TemplateSSIS.CI
+ TemplateSSIS.CI
+ v4.7.2
+ 512
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateSSIS.CI/VariableReferenceMapping.sql b/tSQLtSSISTemplate/TemplateSSIS.CI/VariableReferenceMapping.sql
new file mode 100644
index 0000000..2fb6e80
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS.CI/VariableReferenceMapping.sql
@@ -0,0 +1,16 @@
+Declare @reference_id bigint
+EXEC [SSISDB].[catalog].[create_environment_reference] @environment_name=N'TemplateSSIS', @environment_folder_name=N'TestFolder.ref', @reference_id=@reference_id OUTPUT, @project_name=N'TemplateSSIS', @folder_name=N'TestFolder', @reference_type=A
+Select @reference_id
+GO
+EXEC [SSISDB].[catalog].[set_object_parameter_value] @object_type=20, @parameter_name=N'SourceDB_ConnectionString', @object_name=N'TemplateSSIS', @folder_name=N'TestFolder', @project_name=N'TemplateSSIS', @value_type=R, @parameter_value=N'SourceDB_ConnectionString'
+GO
+EXEC [SSISDB].[catalog].[set_object_parameter_value] @object_type=20, @parameter_name=N'SourceDB_Password', @object_name=N'TemplateSSIS', @folder_name=N'TestFolder', @project_name=N'TemplateSSIS', @value_type=R, @parameter_value=N'SourceDB_Password'
+GO
+EXEC [SSISDB].[catalog].[set_object_parameter_value] @object_type=20, @parameter_name=N'TargetDB_ConnectionString', @object_name=N'TemplateSSIS', @folder_name=N'TestFolder', @project_name=N'TemplateSSIS', @value_type=R, @parameter_value=N'TargetDB_ConnectionString'
+GO
+EXEC [SSISDB].[catalog].[set_object_parameter_value] @object_type=20, @parameter_name=N'TargetDB_Password', @object_name=N'TemplateSSIS', @folder_name=N'TestFolder', @project_name=N'TemplateSSIS', @value_type=R, @parameter_value=N'TargetDB_Password'
+GO
+
+GO
+
+
diff --git a/tSQLtSSISTemplate/TemplateSSIS/Project.params b/tSQLtSSISTemplate/TemplateSSIS/Project.params
new file mode 100644
index 0000000..6eb907c
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS/Project.params
@@ -0,0 +1,66 @@
+
+
+
+
+ {5ca98efc-d874-4151-bfb6-ed53d5f8396e}
+
+
+ 0
+ 0
+ 0
+ tSQLt_SSISTemplate
+ 18
+
+
+
+
+ {e4223dcd-5ffe-42e2-919d-d9ded7f79189}
+
+
+ 0
+ 0
+ 0
+ .,42419
+ 18
+
+
+
+
+ {cc1ba36a-d090-481d-83d7-6c7d69384db6}
+
+
+ 0
+ 0
+ 0
+ Data Source=.,42419;Initial Catalog=tSQLt_SSISTemplate;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;
+ 18
+
+
+
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj
new file mode 100644
index 0000000..a4de0f8
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj
@@ -0,0 +1,349 @@
+
+
+ Project
+ 15.0.2000.170
+ 9.0.1.0
+ $base64$PFNvdXJjZUNvbnRyb2xJbmZvIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmRkbDI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDAzL2VuZ2luZS8yIiB4bWxuczpkZGwyXzI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDAzL2VuZ2luZS8yLzIiIHhtbG5zOmRkbDEwMF8xMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDA4L2VuZ2luZS8xMDAvMTAwIiB4bWxuczpkZGwyMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEwL2VuZ2luZS8yMDAiIHhtbG5zOmRkbDIwMF8yMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEwL2VuZ2luZS8yMDAvMjAwIiB4bWxuczpkZGwzMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDExL2VuZ2luZS8zMDAiIHhtbG5zOmRkbDMwMF8zMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDExL2VuZ2luZS8zMDAvMzAwIiB4bWxuczpkZGw0MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEyL2VuZ2luZS80MDAiIHhtbG5zOmRkbDQwMF80MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEyL2VuZ2luZS80MDAvNDAwIiB4bWxuczpkZGw1MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEzL2VuZ2luZS81MDAiIHhtbG5zOmRkbDUwMF81MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEzL2VuZ2luZS81MDAvNTAwIiB4bWxuczpkd2Q9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vRGF0YVdhcmVob3VzZS9EZXNpZ25lci8xLjAiPg0KICA8RW5hYmxlZD5mYWxzZTwvRW5hYmxlZD4NCiAgPFByb2plY3ROYW1lPjwvUHJvamVjdE5hbWU+DQogIDxBdXhQYXRoPjwvQXV4UGF0aD4NCiAgPExvY2FsUGF0aD48L0xvY2FsUGF0aD4NCiAgPFByb3ZpZGVyPjwvUHJvdmlkZXI+DQo8L1NvdXJjZUNvbnRyb2xJbmZvPg==
+
+ TemplateSSIS.database
+ TemplateSSIS.database
+
+
+
+
+
+
+
+ {e76abba9-f95a-46a8-82a3-80a2bebe6058}
+ TemplateSSIS
+ 1
+ 0
+ 0
+
+
+ 2021-12-26T16:22:58.3471572-05:00
+ DESKTOP-4IR3L3D\lizba
+ DESKTOP-4IR3L3D
+
+
+ AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAACLagM8yK+E2q54vOIoAP+AAAAAACAAAAAAAQZgAAAAEAACAAAAAXS9dPfWOwWAJ3HDes94wLfaK8xBG0VtzA4/c6YNOW9gAAAAAOgAAAAAIAACAAAAA7oELFhoFG/gzFESKylRO62a1uJ+92oZ7fj54wfxMzI5AAAABwu5xD1GanZzsmadm5Ty8QBF3wGY1gMQy9oFXxp438/g+Msk262EF3qiEkZAqLk20QmfXXkWz4az0Q2SKCs7zmpicc+1PlzRwF1MiRShtGjDBIktYOcZAyjAKn231GOWAjpfOCzFSnk4hHK+VmkLOXkqMvI0y9C2HAwa4oMAHvIRfYxJdqri06cptjFuMqnUBAAAAA+16TNg01+eEs4bAmvxmwX/Z7wLR79k8eLXUYiDkFipLNO1sMPBdWsncJ9xJT8sUbNLlbToBhdsoy5REE2mjLSA==
+ 1
+
+
+
+
+
+
+
+
+
+
+ {0F1EA62B-0BC1-442D-9677-D5FE9549B831}
+ TransformObjectList
+ 1
+ 0
+ 23
+
+
+ {8DA0A6E0-76D5-49C3-AB1F-069B9217E569}
+ 8
+
+
+ 1
+
+
+
+
+ {1C0779B8-BE74-4478-AB9E-81342EFEE9C9}
+
+
+
+
+ 0
+ 0
+ 0
+ SELECT * FROM SSISObjects.TransformObjectList_GetObjects;
+ 18
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ false
+ 3
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 1
+ 9
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 5
+ 9
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ false
+ 3
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+ 18
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ false
+ 3
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 18
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ false
+ 3
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ Data Source=.,42419;Initial Catalog=tSQLt_SSISTemplate;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;
+ 18
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 1
+ 9
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 5
+ 9
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ false
+ 3
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+ 18
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ false
+ 3
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 18
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Azure
+
+ bin
+
+
+
+
+ SQLServer2017
+ true
+
+
+
+
+
+
+
+ LastModifiedTime
+ LastModifiedTime
+ 2021-12-26T21:49:19.8944065Z
+
+
+
+
+
+ Development
+
+ bin
+
+
+
+
+ SQLServer2017
+ false
+
+
+
+
+
+
+
+ LastModifiedTime
+ LastModifiedTime
+ 2021-12-27T21:15:07.6696708Z
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx
new file mode 100644
index 0000000..cb354a2
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx
@@ -0,0 +1,626 @@
+
+
+ 8
+
+
+ @[$Project::SourceDB_ConnectionString]
+
+
+
+
+
+ @[$Project::TargetDB_InitialCatalog]
+ @[$Project::TargetDB_ServerName]
+
+
+
+
+
+
+
+ SELECT * FROM SSISObjects.TransformObjectList_GetObjects;
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ [dbo].[TransformedObjectList]
+
+
+ 1252
+ false
+ 3
+ false
+ false
+ TABLOCK,CHECK_CONSTRAINTS
+ 2147483647
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ [SSISObjects].[TransformObjectList_GetObjects]
+
+ select name, SCHEMA_NAME(schema_id) SchemaName, QUOTENAME(SCHEMA_NAME(schema_id)) QuotedSchemaName, QUOTENAME(name) QuotedName from sys.objects
+ $Package::SourceDbConnectionQuery
+ 1252
+ false
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DataSourceViewID
+
+
+ TableInfoObjectType
+ Table
+
+
+
+
+
+
+ DataSourceViewID
+
+
+ TableInfoObjectType
+ View
+
+
+
+]]>
+
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateSSISTests/RunTests.sql b/tSQLtSSISTemplate/TemplateSSISTests/RunTests.sql
new file mode 100644
index 0000000..258abb3
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSISTests/RunTests.sql
@@ -0,0 +1 @@
+EXEC tSQLt.RunAll
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj b/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj
new file mode 100644
index 0000000..2a19072
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj
@@ -0,0 +1,97 @@
+
+
+
+ Debug
+ AnyCPU
+ TemplateSSISTests
+ 2.0
+ 4.1
+ {c01b58d3-06d7-43b1-9514-8131c3935d0b}
+ Microsoft.Data.Tools.Schema.Sql.Sql150DatabaseSchemaProvider
+ Database
+
+
+ TemplateSSISTests
+ TemplateSSISTests
+ 1033, CI
+ BySchemaAndSchemaType
+ True
+ v4.5
+ CS
+ Properties
+ False
+ True
+ True
+
+
+ bin\Release\
+ $(MSBuildProjectName).sql
+ False
+ pdbonly
+ true
+ false
+ true
+ prompt
+ 4
+
+
+ bin\Debug\
+ $(MSBuildProjectName).sql
+ false
+ true
+ full
+ false
+ true
+ true
+ prompt
+ 4
+
+
+ 11.0
+
+ True
+ 11.0
+
+
+
+
+
+
+
+
+
+
+
+ ..\ReferenceObjects\tSQLt.2019.dacpac
+ False
+
+
+ $(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\150\SqlSchemas\master.dacpac
+ False
+ master
+
+
+
+
+ TemplateDatabaseTests
+ $(SqlCmdVar__1)
+
+
+
+
+ TemplateDatabaseTests
+ {2c86a7b1-bd0e-4aa2-aaa6-9df8b515df2a}
+ True
+ False
+
+
+ TemplateDatabase
+ {23a6e107-9ab3-4f27-8365-1c5c19147e94}
+ True
+ False
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tSQLtSSISTemplate/TemplateSSISTests/TransformObjectListTests.sql b/tSQLtSSISTemplate/TemplateSSISTests/TransformObjectListTests.sql
new file mode 100644
index 0000000..f322f23
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSSISTests/TransformObjectListTests.sql
@@ -0,0 +1,78 @@
+--EXEC tSQLt.DropClass 'TransformObjectListTests'
+GO
+CREATE SCHEMA TransformObjectListTests AUTHORIZATION [tSQLt.TestClass]
+GO
+CREATE PROCEDURE TransformObjectListTests.[execute SSIS package TransformObjectList]
+AS
+BEGIN
+ DECLARE @package_name nvarchar(260) = N'TransformObjectList.dtsx';
+ DECLARE @project_name nvarchar(128) = N'TemplateSSIS';
+ DECLARE @folder_name nvarchar(128) = N'TestFolder';
+ DECLARE @environment_name nvarchar(128) = N'TemplateSSIS';
+ DECLARE @environment_folder_name nvarchar(128) = N'TestFolder.ref';
+
+ -- SSIS Execution Parameters
+ DECLARE @execution_id bigint;
+ DECLARE @reference_id bigint = null;
+
+ -- SSIS Catalog Variables (object_type = 50)
+ DECLARE @logging_level smallint = 3;
+ DECLARE @is_synchronized smallint = 1;
+
+ -- Project Variables (object_type = 20)
+ -- N/A
+
+ -- Package Variables (object_type = 30)
+ -- N/A
+
+ /**********************************************************/
+ /* Run the SSIS Package */
+ /**********************************************************/
+
+SELECT @reference_id = ER.reference_id
+ FROM SSISDB.catalog.environment_references AS ER
+ JOIN SSISDB.catalog.projects AS P
+ ON P.project_id = ER.project_id
+ JOIN SSISDB.catalog.folders AS F
+ ON F.folder_id = P.folder_id
+ WHERE F.name = @folder_name
+ AND P.Name = @project_name
+ AND ER.environment_folder_name = @environment_folder_name
+ AND ER.environment_name = @environment_name
+
+
+ EXEC [SSISDB].[catalog].[create_execution]
+ @package_name=@package_name, @execution_id=@execution_id OUTPUT,
+ @folder_name=@folder_name, @project_name=@project_name,
+ @use32bitruntime=False, @reference_id= @reference_id, @runinscaleout=False
+ PRINT 'SSIS ExecutionId:'+ CAST(@execution_id AS NVARCHAR(MAX));
+
+ EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type = 50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@logging_level;
+ EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type = 50, @parameter_name=N'SYNCHRONIZED', @parameter_value=@is_synchronized;
+
+ EXEC [SSISDB].[catalog].[start_execution] @execution_id
+
+END
+GO
+GO
+--[@tSQLt:NoTransaction](DEFAULT)
+CREATE PROCEDURE TransformObjectListTests.[test SSIS is cool]
+AS
+BEGIN
+
+ EXEC tSQLt.FakeTable 'dbo.TransformedObjectList';
+ EXEC tSQLt.FakeTable 'SSISObjects.TransformObjectList_GetObjects';
+ EXEC('INSERT INTO SSISObjects.TransformObjectList_GetObjects(QuotedSchemaName,QuotedName) VALUES(''[QSN1]'',''[QN1]'');');
+
+ EXEC TransformObjectListTests.[execute SSIS package TransformObjectList];
+
+ SELECT QuotedFullName INTO #Actual FROM dbo.TransformedObjectList;
+ SELECT TOP(0)A.* INTO #Expected FROM #Actual A RIGHT JOIN #Actual X ON 1=0;
+ INSERT INTO #Expected VALUES('[QSN1].[QN1]');
+
+ EXEC tSQLt.AssertEqualsTable '#Expected','#Actual';
+
+
+
+END;
+GO
diff --git a/tSQLtSSISTemplate/TemplateSolution.sln b/tSQLtSSISTemplate/TemplateSolution.sln
new file mode 100644
index 0000000..bd2c70d
--- /dev/null
+++ b/tSQLtSSISTemplate/TemplateSolution.sln
@@ -0,0 +1,97 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31829.152
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{159641D6-6404-4A2A-AE62-294DE0FE8301}") = "TemplateSSIS", "TemplateSSIS\TemplateSSIS.dtproj", "{3870F7D5-3FFC-4ABA-9CAA-F8DC130C73F5}"
+EndProject
+Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "TemplateDatabase", "TemplateDatabase\TemplateDatabase.sqlproj", "{23A6E107-9AB3-4F27-8365-1C5C19147E94}"
+EndProject
+Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "TemplateDatabaseTests", "TemplateDatabaseTests\TemplateDatabaseTests.sqlproj", "{2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}"
+EndProject
+Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "TemplateSSISTests", "TemplateSSISTests\TemplateSSISTests.sqlproj", "{C01B58D3-06D7-43B1-9514-8131C3935D0B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TemplateSSIS.CI", "TemplateSSIS.CI\TemplateSSIS.CI.csproj", "{52EFCC53-D796-4C8D-85E7-43DA7A3FFCED}"
+EndProject
+Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "ReferenceObjects", "ReferenceObjects\ReferenceObjects.sqlproj", "{7DE3B0BC-090A-4CE6-A691-23291168B692}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Azure|Any CPU = Azure|Any CPU
+ Debug|Any CPU = Debug|Any CPU
+ Development|Any CPU = Development|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3870F7D5-3FFC-4ABA-9CAA-F8DC130C73F5}.Azure|Any CPU.ActiveCfg = Azure
+ {3870F7D5-3FFC-4ABA-9CAA-F8DC130C73F5}.Azure|Any CPU.Build.0 = Azure
+ {3870F7D5-3FFC-4ABA-9CAA-F8DC130C73F5}.Debug|Any CPU.ActiveCfg = Development
+ {3870F7D5-3FFC-4ABA-9CAA-F8DC130C73F5}.Debug|Any CPU.Build.0 = Development
+ {3870F7D5-3FFC-4ABA-9CAA-F8DC130C73F5}.Development|Any CPU.ActiveCfg = Development
+ {3870F7D5-3FFC-4ABA-9CAA-F8DC130C73F5}.Development|Any CPU.Build.0 = Development
+ {3870F7D5-3FFC-4ABA-9CAA-F8DC130C73F5}.Release|Any CPU.ActiveCfg = Development
+ {3870F7D5-3FFC-4ABA-9CAA-F8DC130C73F5}.Release|Any CPU.Build.0 = Development
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Azure|Any CPU.ActiveCfg = Release|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Azure|Any CPU.Build.0 = Release|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Azure|Any CPU.Deploy.0 = Release|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Development|Any CPU.ActiveCfg = Debug|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Development|Any CPU.Build.0 = Debug|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Development|Any CPU.Deploy.0 = Debug|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Release|Any CPU.Build.0 = Release|Any CPU
+ {23A6E107-9AB3-4F27-8365-1C5C19147E94}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Azure|Any CPU.ActiveCfg = Release|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Azure|Any CPU.Build.0 = Release|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Azure|Any CPU.Deploy.0 = Release|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Development|Any CPU.ActiveCfg = Debug|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Development|Any CPU.Build.0 = Debug|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Development|Any CPU.Deploy.0 = Debug|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2C86A7B1-BD0E-4AA2-AAA6-9DF8B515DF2A}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Azure|Any CPU.ActiveCfg = Release|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Azure|Any CPU.Build.0 = Release|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Azure|Any CPU.Deploy.0 = Release|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Development|Any CPU.ActiveCfg = Debug|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Development|Any CPU.Build.0 = Debug|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Development|Any CPU.Deploy.0 = Debug|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C01B58D3-06D7-43B1-9514-8131C3935D0B}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED}.Azure|Any CPU.ActiveCfg = Debug|Any CPU
+ {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED}.Azure|Any CPU.Build.0 = Debug|Any CPU
+ {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED}.Development|Any CPU.ActiveCfg = Debug|Any CPU
+ {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED}.Development|Any CPU.Build.0 = Debug|Any CPU
+ {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Azure|Any CPU.ActiveCfg = Release|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Azure|Any CPU.Build.0 = Release|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Azure|Any CPU.Deploy.0 = Release|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Development|Any CPU.ActiveCfg = Debug|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Development|Any CPU.Build.0 = Debug|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Development|Any CPU.Deploy.0 = Debug|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7DE3B0BC-090A-4CE6-A691-23291168B692}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {E5EDBA7E-450D-47C1-BB39-1D69BC3B2B11}
+ EndGlobalSection
+EndGlobal