From 3f2ab49564840cd543c101d9d3f371c534f68888 Mon Sep 17 00:00:00 2001 From: Liz Baron <10554+lizbaron@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:25:03 -0500 Subject: [PATCH 1/8] init commit --- .../TemplateDatabase/TemplateDatabase.sqlproj | 60 ++ .../TemplateDatabaseTests.sqlproj | 60 ++ tSQLtSSISTemplate/TemplateSSIS/Project.params | 2 + .../TemplateSSIS/TemplateSSIS.dtproj | 415 ++++++++++++ .../TemplateSSIS/TransformObjectList.dtsx | 595 ++++++++++++++++++ .../TemplateSSIS/sourceDB.conmgr | 16 + .../TemplateSSIS/targetDB.conmgr | 16 + .../TemplateSSISTests.sqlproj | 60 ++ tSQLtSSISTemplate/TemplateSolution.sln | 73 +++ 9 files changed, 1297 insertions(+) create mode 100644 tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj create mode 100644 tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj create mode 100644 tSQLtSSISTemplate/TemplateSSIS/Project.params create mode 100644 tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj create mode 100644 tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx create mode 100644 tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr create mode 100644 tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr create mode 100644 tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj create mode 100644 tSQLtSSISTemplate/TemplateSolution.sln diff --git a/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj b/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj new file mode 100644 index 0000000..6779a37 --- /dev/null +++ b/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj @@ -0,0 +1,60 @@ + + + + Debug + AnyCPU + TemplateDatabase + 2.0 + 4.1 + {23a6e107-9ab3-4f27-8365-1c5c19147e94} + Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider + 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 + + + + + + + \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj b/tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj new file mode 100644 index 0000000..61cff22 --- /dev/null +++ b/tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj @@ -0,0 +1,60 @@ + + + + Debug + AnyCPU + TemplateDatabaseTests + 2.0 + 4.1 + {2c86a7b1-bd0e-4aa2-aaa6-9df8b515df2a} + Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider + 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 + + + + + + + \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSSIS/Project.params b/tSQLtSSISTemplate/TemplateSSIS/Project.params new file mode 100644 index 0000000..680ffe3 --- /dev/null +++ b/tSQLtSSISTemplate/TemplateSSIS/Project.params @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj new file mode 100644 index 0000000..1940d74 --- /dev/null +++ b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj @@ -0,0 +1,415 @@ + + + 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+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAAAiRzRO4uuz+kfz0w+pf84f+/A0tfLPAbOSuyIQQMhqngAAAAAOgAAAAAIAACAAAAAmBvPAMzR0VwHuo40+cpXVt1X4OvYE2OKqSY4KRyCSSZAAAAAwuzVky3BnNCtW1YxWe+4Yp2LaCAbu15gHDXkm0m5f8+Al5cQ2XfiGsUoKWc3sHN+JdLhb6NP9N7IfaVPna2AlQ89Dl1ILdwThYxiOrIIYgMMuGUXKJ+HQNfEoBgwkcNyjGU/o/2uL0qv3iQKP0g77fJqS2Kx+AB2ujIHeZkg5VjR7/HkqOAid8zxD/gSjCntAAAAAJJdQQTVbdoYtwE88BEpcezijUvz9nZhS2dHaZ4ARTWii013xR6MWzeVeoVppLCimBqkjwd6kTUnS4W3zC/EcGQ== + 1 + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + false + 3 + + + + + + + + + + + 0 + 0 + 0 + Data Source=.,41433;User ID=tSQLt_sa;Initial Catalog=tSQLt_Dev;Provider=SQLNCLI11.1;Auto Translate=False; + 18 + + + + + + + + + + + 0 + 0 + 0 + 1 + 9 + + + + + + + + + + + 0 + 0 + 0 + 5 + 9 + + + + + + + + + + + 0 + 0 + 0 + false + 3 + + + + + + + + + + + 0 + 0 + 0 + tSQLt_Dev + 18 + + + + + + + + + + + 0 + 0 + 1 + 18 + + + + + + + + + + + 0 + 0 + 0 + false + 3 + + + + + + + + + + + 0 + 0 + 0 + .,41433 + 18 + + + + + + + + + + + 0 + 0 + 0 + tSQLt_sa + 18 + + + + + + + + + + + 0 + 0 + 0 + false + 3 + + + + + + + + + + + 0 + 0 + 0 + Data Source=.,41433;User ID=tSQLt_sa;Initial Catalog=tSQLt_Dev;Provider=SQLNCLI11.1;Application Name=TargetDBConnection;Auto Translate=False; + 18 + + + + + + + + + + + 0 + 0 + 0 + 1 + 9 + + + + + + + + + + + 0 + 0 + 0 + 5 + 9 + + + + + + + + + + + 0 + 0 + 0 + false + 3 + + + + + + + + + + + 0 + 0 + 0 + tSQLt_Dev + 18 + + + + + + + + + + + 0 + 0 + 1 + 18 + + + + + + + + + + + 0 + 0 + 0 + false + 3 + + + + + + + + + + + 0 + 0 + 0 + .,41433 + 18 + + + + + + + + + + + 0 + 0 + 0 + tSQLt_sa + 18 + + + + + + + {0F1EA62B-0BC1-442D-9677-D5FE9549B831} + TransformObjectList + 1 + 0 + 7 + + + {755A3814-EB30-47E5-BFD5-D96EE2002CB1} + 8 + + + 1 + + + + + + + + + + + + + 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..3cc9e49 --- /dev/null +++ b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx @@ -0,0 +1,595 @@ + + + 8 + + + + + + + + + + 0 + [OLE DB Destination] + + + 1252 + false + 3 + false + false + TABLOCK,CHECK_CONSTRAINTS + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + select name, SCHEMA_NAME(schema_id) SchemaName, QUOTENAME(SCHEMA_NAME(schema_id)) QuotedSchemaName, QUOTENAME(name) QuotedName from sys.objects + + 1252 + false + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #{Package\Data Flow Task\OLE DB Source.Outputs[OLE DB Source Output].Columns[QuotedSchemaName]} + "." + #{Package\Data Flow Task\OLE DB Source.Outputs[OLE DB Source Output].Columns[QuotedName]} + QuotedSchemaName + "." + QuotedName + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DataSourceViewID + + + TableInfoObjectType + Table + + + + + + + DataSourceViewID + + + TableInfoObjectType + Table + + + +]]> + \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr b/tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr new file mode 100644 index 0000000..b0bab81 --- /dev/null +++ b/tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr @@ -0,0 +1,16 @@ + + + + + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAACeA0eDRCglsunOrEyZZlrjpkgfQNuX57sDvM6pKl+LXAAAAAAOgAAAAAIAACAAAAAXCj5B82h0X6h8eeHGsdhSmBdsKhNDqErGPWXdI6UC7oAAAABecyzGWJ6TtC8R8Q2oKSQLfGY1wYS3k3wIZw3h9MmL8DcMjcQmSzBVO4RA2J7XTRs+6hFCIZklyvYS2Nx9OvsmE8PWqpH6LSMsXjtjIfD/wPrjfqLDO1TPAyfha0ZMv7DEAoK6m3W7dqPQdaRoKEBkX9ZDDPjkUocBjGfVlW9R9EAAAAAaFpbOL2l999nvJeHLbnRLmKtr4QPPoQDYBN1fVeAWKoLUzWGnbC1aqFxZL+Hd4JwCcgGTxj37c4yfvvq855VU + + + \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr b/tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr new file mode 100644 index 0000000..880aa0c --- /dev/null +++ b/tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr @@ -0,0 +1,16 @@ + + + + + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAADKfTv17XwWzf1dUExYrnhPJhAbFzOEf1WWbrghqPxNlgAAAAAOgAAAAAIAACAAAAC1b1w7iNkucoeSAs+B6dDpw9bPq2sJuBMOZ70GM5CTBIAAAAC374dvVhshw144bCbB+reYcG/Ip7AXxmV3Zg7JhGBxCSUGS0F04nm5zVHtCTPDfhC7y/37kEtyPb81F4IiBR/FoudUg4xFbynWorSS0lYBI56WqEVfzYFuR/sCCqJJXw3aMdMNAWWqeutVOLitYDUPltRxhmjGiR3SBoiLuwIOx0AAAAAlKUDA+1YoTIB4AH7llKUKLgLTibRM4Hq4peZ0sqPJqrPKKe/YnjfpQiQL5Kj2oYteTUhCp6rv4CFxSyOw+V6L + + + \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj b/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj new file mode 100644 index 0000000..6d5b5f3 --- /dev/null +++ b/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj @@ -0,0 +1,60 @@ + + + + Debug + AnyCPU + TemplateSSISTests + 2.0 + 4.1 + {c01b58d3-06d7-43b1-9514-8131c3935d0b} + Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider + 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 + + + + + + + \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSolution.sln b/tSQLtSSISTemplate/TemplateSolution.sln new file mode 100644 index 0000000..07bd504 --- /dev/null +++ b/tSQLtSSISTemplate/TemplateSolution.sln @@ -0,0 +1,73 @@ + +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 +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 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E5EDBA7E-450D-47C1-BB39-1D69BC3B2B11} + EndGlobalSection +EndGlobal From 94a06d19e1f708a513777adf460d11e34e5bb1b4 Mon Sep 17 00:00:00 2001 From: Liz Baron <10554+lizbaron@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:35:51 -0500 Subject: [PATCH 2/8] playing with parameters. --- .../TemplateSSIS/TemplateSSIS.dtproj | 27 ++++++++++++++----- .../TemplateSSIS/TransformObjectList.dtsx | 21 +++++++++++---- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj index 1940d74..cc8915f 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj +++ b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj @@ -5,8 +5,8 @@ 9.0.1.0 $base64$PFNvdXJjZUNvbnRyb2xJbmZvIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmRkbDI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDAzL2VuZ2luZS8yIiB4bWxuczpkZGwyXzI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDAzL2VuZ2luZS8yLzIiIHhtbG5zOmRkbDEwMF8xMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDA4L2VuZ2luZS8xMDAvMTAwIiB4bWxuczpkZGwyMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEwL2VuZ2luZS8yMDAiIHhtbG5zOmRkbDIwMF8yMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEwL2VuZ2luZS8yMDAvMjAwIiB4bWxuczpkZGwzMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDExL2VuZ2luZS8zMDAiIHhtbG5zOmRkbDMwMF8zMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDExL2VuZ2luZS8zMDAvMzAwIiB4bWxuczpkZGw0MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEyL2VuZ2luZS80MDAiIHhtbG5zOmRkbDQwMF80MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEyL2VuZ2luZS80MDAvNDAwIiB4bWxuczpkZGw1MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEzL2VuZ2luZS81MDAiIHhtbG5zOmRkbDUwMF81MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEzL2VuZ2luZS81MDAvNTAwIiB4bWxuczpkd2Q9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vRGF0YVdhcmVob3VzZS9EZXNpZ25lci8xLjAiPg0KICA8RW5hYmxlZD5mYWxzZTwvRW5hYmxlZD4NCiAgPFByb2plY3ROYW1lPjwvUHJvamVjdE5hbWU+DQogIDxBdXhQYXRoPjwvQXV4UGF0aD4NCiAgPExvY2FsUGF0aD48L0xvY2FsUGF0aD4NCiAgPFByb3ZpZGVyPjwvUHJvdmlkZXI+DQo8L1NvdXJjZUNvbnRyb2xJbmZvPg== - TemplateSSIS.database - TemplateSSIS.database + TemplateSSIS 1.database + TemplateSSIS 1.database @@ -26,7 +26,7 @@ DESKTOP-4IR3L3D - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAAAiRzRO4uuz+kfz0w+pf84f+/A0tfLPAbOSuyIQQMhqngAAAAAOgAAAAAIAACAAAAAmBvPAMzR0VwHuo40+cpXVt1X4OvYE2OKqSY4KRyCSSZAAAAAwuzVky3BnNCtW1YxWe+4Yp2LaCAbu15gHDXkm0m5f8+Al5cQ2XfiGsUoKWc3sHN+JdLhb6NP9N7IfaVPna2AlQ89Dl1ILdwThYxiOrIIYgMMuGUXKJ+HQNfEoBgwkcNyjGU/o/2uL0qv3iQKP0g77fJqS2Kx+AB2ujIHeZkg5VjR7/HkqOAid8zxD/gSjCntAAAAAJJdQQTVbdoYtwE88BEpcezijUvz9nZhS2dHaZ4ARTWii013xR6MWzeVeoVppLCimBqkjwd6kTUnS4W3zC/EcGQ== + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAABnmirY+iXzpgXIT/u/9VXigw0fiwluxXZ0KtsKsGDccgAAAAAOgAAAAAIAACAAAACDnDhGFAWUFkZhNhm53UyF0htZ6ZkCCSiy7r+s5KS+B5AAAABZ5Azur7EcVT1R1DtuvAw75Fgq93WM6TeeI/HmREX78biKx7tC3+pZ2qt/VXmsyXOE2kJZhQdgkmRTo2lSZOIctOI8XeC4IGRFbUsaZmgVXRjbq67WUnGZVTeKtWrMHidOReTKzWD4c5QEc0oQ0X/3wezFI23GqRADJH3iUnHIIKaLSR3uso2k9kYckq4rWm5AAAAAzrXC5qjc63XIPJIjCVWTqsMKE+4g8UniYKxpi4Dia8Umx07HYxzp1UfbS+Ygaec8odroimLTSpHe7/1umDU6OQ== 1 @@ -344,16 +344,31 @@ TransformObjectList 1 0 - 7 + 8 - {755A3814-EB30-47E5-BFD5-D96EE2002CB1} + {C29636C6-E92A-4014-A0CA-F5D68231EC9F} 8 1 - + + + + {1C0779B8-BE74-4478-AB9E-81342EFEE9C9} + + + + + 0 + 0 + 0 + select name, SCHEMA_NAME(schema_id) SchemaName, QUOTENAME(SCHEMA_NAME(schema_id)) QuotedSchemaName, QUOTENAME(name) QuotedName from sys.objects + 18 + + + diff --git a/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx index 3cc9e49..2ff4851 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx +++ b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx @@ -11,10 +11,21 @@ DTS:LocaleID="1033" DTS:ObjectName="TransformObjectList" DTS:PackageType="5" - DTS:VersionBuild="7" - DTS:VersionGUID="{755A3814-EB30-47E5-BFD5-D96EE2002CB1}"> + DTS:VersionBuild="8" + DTS:VersionGUID="{C29636C6-E92A-4014-A0CA-F5D68231EC9F}"> 8 + + + select name, SCHEMA_NAME(schema_id) SchemaName, QUOTENAME(SCHEMA_NAME(schema_id)) QuotedSchemaName, QUOTENAME(name) QuotedName from sys.objects + + @@ -222,7 +233,7 @@ + name="SqlCommandVariable">$Package::SourceDbConnectionQuery 2 + typeConverter="AccessMode">3 Date: Thu, 30 Dec 2021 06:56:56 -0500 Subject: [PATCH 3/8] parameterizing. --- tSQLtSSISTemplate/TemplateSSIS/Project.params | 89 ++++++++++++++++++- .../TemplateSSIS/TemplateSSIS.dtproj | 32 +------ .../TemplateSSIS/TransformObjectList.dtsx | 26 ++---- .../TemplateSSIS/sourceDB.conmgr | 6 +- .../TemplateSSIS/targetDB.conmgr | 6 +- 5 files changed, 106 insertions(+), 53 deletions(-) diff --git a/tSQLtSSISTemplate/TemplateSSIS/Project.params b/tSQLtSSISTemplate/TemplateSSIS/Project.params index 680ffe3..88272ae 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/Project.params +++ b/tSQLtSSISTemplate/TemplateSSIS/Project.params @@ -1,2 +1,89 @@  - \ No newline at end of file + + + + {33cc45ca-2878-4b50-9895-a9b96afb0b9e} + + + 0 + 1 + 0 + Data Source=.,41433;User ID=tSQLt_sa;Initial Catalog=tSQLt_Dev;Provider=SQLNCLI11.1;Auto Translate=False; + 18 + + + + + {b62f29a8-a656-495a-b0be-e9eeb0e214ee} + + + 0 + 1 + 0 + Data Source=.,41433;User ID=tSQLt_sa;Initial Catalog=tSQLt_Dev;Provider=SQLNCLI11.1;Application Name=TargetDBConnection;Auto Translate=False; + 18 + + + + + {f1f1ba35-addc-4104-a90f-3214904570eb} + + + 0 + 1 + 1 + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAABrVSCAtFlXo3pzwii0lfTBjw1lsMZJBXBVR/pJDrmfxAAAAAAOgAAAAAIAACAAAABAQyeT4ji6/6l9r8jKPgdkUMYeNK4+splwUJ1bLSvsHYAAAADQFUuFZk6alsmbJPMi9yFVvf1LsjSAGaj5ZhPk5s1Cxitiq4bHQQeEDdGPVEKDshGQASBKE04G1VJM68WFYHUEWpTP4YMoReV3TXDc3y5zwxGsmwOU1uVxS3h2eJRX3XRXKRnJo2SOK6b/Lv+k+5OWMlD7qnD16GiWwTB0me+k4kAAAAB7MycME58LizAYHkxN4Nd5Cvbnma5tKhFzqrHX5LD4MSy9M+ixNur7dlwScl7SHLiXbbkX7B1Hd2mMwXKdx/GK + 18 + + + + + {94d8127a-e18d-4e19-aba6-5bb4bd2bf34d} + + + 0 + 1 + 1 + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAACXEyoewIeBKzBK/ELLwRp+RIHIlNKhaiqTfmntoHb1xwAAAAAOgAAAAAIAACAAAAAgzGaw4hDmAmRKmTw8/02lv7SjZmUig/H6qySaN7cW4IAAAADp6P/hxyxqBsc/1siBRINJGSBaB9r2G/GlcTw/4WmILuIDp02+0ismyFHxjA5nUKtfNKvEXyoCypsqZ6N6F8dWxsFT49oBXSOGEZK8xqvFNxJmcWEvN47f8fw6aPrkV/VEwJwxJs9xv2AHHK9CZb5L7Jns3FIsTAZ3QJBnsGeAzUAAAABGftiUW9fGMFevIpNvF5rZuSa7U9z9Cp9jM3YS2BDtez+CSafNO/ZvkExDC/aogZ0N78UDWU3DKeG1DtUhX+iv + 18 + + + \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj index cc8915f..7f7d04f 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj +++ b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj @@ -26,7 +26,7 @@ DESKTOP-4IR3L3D - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAABnmirY+iXzpgXIT/u/9VXigw0fiwluxXZ0KtsKsGDccgAAAAAOgAAAAAIAACAAAACDnDhGFAWUFkZhNhm53UyF0htZ6ZkCCSiy7r+s5KS+B5AAAABZ5Azur7EcVT1R1DtuvAw75Fgq93WM6TeeI/HmREX78biKx7tC3+pZ2qt/VXmsyXOE2kJZhQdgkmRTo2lSZOIctOI8XeC4IGRFbUsaZmgVXRjbq67WUnGZVTeKtWrMHidOReTKzWD4c5QEc0oQ0X/3wezFI23GqRADJH3iUnHIIKaLSR3uso2k9kYckq4rWm5AAAAAzrXC5qjc63XIPJIjCVWTqsMKE+4g8UniYKxpi4Dia8Umx07HYxzp1UfbS+Ygaec8odroimLTSpHe7/1umDU6OQ== + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAACYp05DcUM+b/5TjWCAvb/JQ6hF6tUaeN2Z+SdtkUczqwAAAAAOgAAAAAIAACAAAADdV/Mv9rT6J3bMUnEPbJSX6m2nxCjh9vI1XIASzyf3OpAAAADPKtUa8E9Euj/mKnVIXABo7d2gUeHSIbKtWTIyZHaJs/8hFNMzkdVFiHiQ7CrZ6kNinsyoZPDHPDmyjf6uuBtF9NGz9JTRJ82/R7hWcBCUFDQf50EC99tfAmU5SC88z9n5U4E8rlEMhtmitY0BBTdWjnucicr0QpZ4UL0GaXUYudJzQ8PCAsw403fhhgcLHFJAAAAAEpgG1z8uY8I4NM79cC/kqLksMKBRM2iOCzEo5McOp/BboOfvauHHsgmzFL5qeERiH1jzfCG9qkvZwhT6esQvcg== 1 @@ -53,21 +53,6 @@ 3 - - - - - - - - - 0 - 0 - 0 - Data Source=.,41433;User ID=tSQLt_sa;Initial Catalog=tSQLt_Dev;Provider=SQLNCLI11.1;Auto Translate=False; - 18 - - @@ -202,21 +187,6 @@ 3 - - - - - - - - - 0 - 0 - 0 - Data Source=.,41433;User ID=tSQLt_sa;Initial Catalog=tSQLt_Dev;Provider=SQLNCLI11.1;Application Name=TargetDBConnection;Auto Translate=False; - 18 - - diff --git a/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx index 2ff4851..662cb79 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx +++ b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx @@ -11,8 +11,8 @@ DTS:LocaleID="1033" DTS:ObjectName="TransformObjectList" DTS:PackageType="5" - DTS:VersionBuild="8" - DTS:VersionGUID="{C29636C6-E92A-4014-A0CA-F5D68231EC9F}"> + DTS:VersionBuild="9" + DTS:VersionGUID="{3E3F0B75-1B49-4F1C-BD35-37C566D6E2F6}"> 8 @@ -508,7 +508,7 @@ + TopLeft="3.00000009934102,261.744446480892" /> + TopLeft="87.36111111663,175.944445468408"> + End="0,78.3000010124842"> - - - - + End="0,78.3000010124842" /> diff --git a/tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr b/tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr index b0bab81..4111189 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr +++ b/tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr @@ -3,6 +3,10 @@ DTS:ObjectName="sourceDB" DTS:DTSID="{E9C9113E-C2A4-4DE2-A9BA-9665B91E7688}" DTS:CreationName="OLEDB"> + @[$Project::SourceDB_ConnectionString] + @[$Project::SourceDB_Password] AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAACeA0eDRCglsunOrEyZZlrjpkgfQNuX57sDvM6pKl+LXAAAAAAOgAAAAAIAACAAAAAXCj5B82h0X6h8eeHGsdhSmBdsKhNDqErGPWXdI6UC7oAAAABecyzGWJ6TtC8R8Q2oKSQLfGY1wYS3k3wIZw3h9MmL8DcMjcQmSzBVO4RA2J7XTRs+6hFCIZklyvYS2Nx9OvsmE8PWqpH6LSMsXjtjIfD/wPrjfqLDO1TPAyfha0ZMv7DEAoK6m3W7dqPQdaRoKEBkX9ZDDPjkUocBjGfVlW9R9EAAAAAaFpbOL2l999nvJeHLbnRLmKtr4QPPoQDYBN1fVeAWKoLUzWGnbC1aqFxZL+Hd4JwCcgGTxj37c4yfvvq855VU + Sensitive="1">AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAABYwKz6gZ7RfWLbmZsknl7wPO17+ZHRhj1AgSbrKwn3UgAAAAAOgAAAAAIAACAAAAC6PKgRRxZl9kDGlYGupxMMY07mtd/roBoWRSwd5O4hOIAAAADlMVwiNZuapPuZUDDmX25LYRkYr+dzwYA0qmM0VzCDQlW5i1NXOQMDSOPVROapevORPHnL/AZZTnRIvoNVAdUJ5ugvhfDySEQGZEg48EKR2dc9ld5U1nUg3BfnNSfPUllHDbvr85OrRiGvAr2CTCLqWMWUvT22rv/c2wb7hNmOwEAAAACGABY3E7rD3Nwa45IozfId9eEOPK+LiM27nSY37WIBBBbHj1RuKP7nswooW2b9aH8ETA2q2Vu1OxZAHO9LeK/z \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr b/tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr index 880aa0c..194f5ec 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr +++ b/tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr @@ -3,6 +3,10 @@ DTS:ObjectName="targetDB" DTS:DTSID="{8C72DA7D-74F4-4FE8-9693-F4378FCF2E27}" DTS:CreationName="OLEDB"> + @[$Project::TargetDB_ConnectionString] + @[$Project::TargetDB_Password] AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAADKfTv17XwWzf1dUExYrnhPJhAbFzOEf1WWbrghqPxNlgAAAAAOgAAAAAIAACAAAAC1b1w7iNkucoeSAs+B6dDpw9bPq2sJuBMOZ70GM5CTBIAAAAC374dvVhshw144bCbB+reYcG/Ip7AXxmV3Zg7JhGBxCSUGS0F04nm5zVHtCTPDfhC7y/37kEtyPb81F4IiBR/FoudUg4xFbynWorSS0lYBI56WqEVfzYFuR/sCCqJJXw3aMdMNAWWqeutVOLitYDUPltRxhmjGiR3SBoiLuwIOx0AAAAAlKUDA+1YoTIB4AH7llKUKLgLTibRM4Hq4peZ0sqPJqrPKKe/YnjfpQiQL5Kj2oYteTUhCp6rv4CFxSyOw+V6L + Sensitive="1">AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAAD/VyeTFM74G1aE/rw5kCgjrlsxawth1wAtDwvJdVb4hwAAAAAOgAAAAAIAACAAAABZcJa9cilNWWx06VjIdGSHUje3UgR6VEE6KfiEBY3OCIAAAADdmvwoziph4C2LU/5E6IQAbzNQCIvXPBIjFus8hPwPxtjH8TpW529nFRjXhIODcbTkh4KfZILa9PI+3Ce68bj5TVxxQn785OfFiAM+3uZgS8mz3KUBuGD6nj4pcnpLFbZhloichphuL8MMqKKA7SaiM70LFS9u8skYLpvOFC2EukAAAADL+6/CTgKTLFTFkb5oPcHhn679vcCdK2EnaHVErsqIaHh4SGy/t3zngVCkREEv8kuHw/sFpLAZeFJeL5mJ98Hh \ No newline at end of file From 62928afe899ecf6a9c068cd1845940f74ff7107f Mon Sep 17 00:00:00 2001 From: mbt1 Date: Thu, 30 Dec 2021 16:55:16 -0500 Subject: [PATCH 4/8] getting SSIS Packages fully parameterized --- .gitignore | 1 + .../TemplateSSIS.CI/DeploySSIS.ps1 | 1 + .../TemplateSSIS.CI/SetVariableValues.sql | 20 +++++++ .../TemplateSSIS.CI/TemplateSSIS.CI.csproj | 57 +++++++++++++++++++ .../VariableReferenceMapping.sql | 16 ++++++ .../TemplateSSIS/TemplateSSIS.dtproj | 34 +---------- .../TemplateSSISTests.sqlproj | 3 + tSQLtSSISTemplate/TemplateSolution.sln | 10 ++++ 8 files changed, 111 insertions(+), 31 deletions(-) create mode 100644 tSQLtSSISTemplate/TemplateSSIS.CI/DeploySSIS.ps1 create mode 100644 tSQLtSSISTemplate/TemplateSSIS.CI/SetVariableValues.sql create mode 100644 tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj create mode 100644 tSQLtSSISTemplate/TemplateSSIS.CI/VariableReferenceMapping.sql 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/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/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..37225ef --- /dev/null +++ b/tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj @@ -0,0 +1,57 @@ + + + + + Debug + AnyCPU + {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED} + Exe + 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/TemplateSSIS.dtproj b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj index 7f7d04f..c62aacf 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj +++ b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj @@ -5,8 +5,8 @@ 9.0.1.0 $base64$PFNvdXJjZUNvbnRyb2xJbmZvIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmRkbDI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDAzL2VuZ2luZS8yIiB4bWxuczpkZGwyXzI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDAzL2VuZ2luZS8yLzIiIHhtbG5zOmRkbDEwMF8xMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDA4L2VuZ2luZS8xMDAvMTAwIiB4bWxuczpkZGwyMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEwL2VuZ2luZS8yMDAiIHhtbG5zOmRkbDIwMF8yMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEwL2VuZ2luZS8yMDAvMjAwIiB4bWxuczpkZGwzMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDExL2VuZ2luZS8zMDAiIHhtbG5zOmRkbDMwMF8zMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDExL2VuZ2luZS8zMDAvMzAwIiB4bWxuczpkZGw0MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEyL2VuZ2luZS80MDAiIHhtbG5zOmRkbDQwMF80MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEyL2VuZ2luZS80MDAvNDAwIiB4bWxuczpkZGw1MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEzL2VuZ2luZS81MDAiIHhtbG5zOmRkbDUwMF81MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEzL2VuZ2luZS81MDAvNTAwIiB4bWxuczpkd2Q9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vRGF0YVdhcmVob3VzZS9EZXNpZ25lci8xLjAiPg0KICA8RW5hYmxlZD5mYWxzZTwvRW5hYmxlZD4NCiAgPFByb2plY3ROYW1lPjwvUHJvamVjdE5hbWU+DQogIDxBdXhQYXRoPjwvQXV4UGF0aD4NCiAgPExvY2FsUGF0aD48L0xvY2FsUGF0aD4NCiAgPFByb3ZpZGVyPjwvUHJvdmlkZXI+DQo8L1NvdXJjZUNvbnRyb2xJbmZvPg== - TemplateSSIS 1.database - TemplateSSIS 1.database + TemplateSSIS.database + TemplateSSIS.database @@ -26,7 +26,7 @@ DESKTOP-4IR3L3D - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAACYp05DcUM+b/5TjWCAvb/JQ6hF6tUaeN2Z+SdtkUczqwAAAAAOgAAAAAIAACAAAADdV/Mv9rT6J3bMUnEPbJSX6m2nxCjh9vI1XIASzyf3OpAAAADPKtUa8E9Euj/mKnVIXABo7d2gUeHSIbKtWTIyZHaJs/8hFNMzkdVFiHiQ7CrZ6kNinsyoZPDHPDmyjf6uuBtF9NGz9JTRJ82/R7hWcBCUFDQf50EC99tfAmU5SC88z9n5U4E8rlEMhtmitY0BBTdWjnucicr0QpZ4UL0GaXUYudJzQ8PCAsw403fhhgcLHFJAAAAAEpgG1z8uY8I4NM79cC/kqLksMKBRM2iOCzEo5McOp/BboOfvauHHsgmzFL5qeERiH1jzfCG9qkvZwhT6esQvcg== + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAACLagM8yK+E2q54vOIoAP+AAAAAACAAAAAAAQZgAAAAEAACAAAACCcLbroAQRoM+xzs2wzOhZp7rYvF/EIe2BXnsrh5fwKwAAAAAOgAAAAAIAACAAAACpWD7c8ZMCxuFqQ6drTYnIyZ9OYaBsBAnUSNnWEstPeZAAAADahGxSnzIcCnMrmQMIU1iJbCex8+FLBAEzS6onuzLAdEbYJ/HsjK+9WW/uo0pycLgvbToPXuFZCLh6vF/daOtUQPmfBTn4K4Wdnc8OZrx67KxGhew0AKxQCaCSkIokIeDkA6u50tKTCVf4SKozaVU40T/3wTK71VnlEX/GFJytQvc8tgR36cjE8BKLVSk/lzpAAAAAkR12n0ps6WTgkG96ssI1I/CRPbCwzLP5ecc22dV5FrR/FVxQqZElHpXej+Wf9mub/gtOzQR9Tk47UYJ3fQoKvQ== 1 @@ -113,20 +113,6 @@ 18 - - - - - - - - - 0 - 0 - 1 - 18 - - @@ -247,20 +233,6 @@ 18 - - - - - - - - - 0 - 0 - 1 - 18 - - diff --git a/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj b/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj index 6d5b5f3..83f9738 100644 --- a/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj +++ b/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj @@ -57,4 +57,7 @@ + + + \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSolution.sln b/tSQLtSSISTemplate/TemplateSolution.sln index 07bd504..3178382 100644 --- a/tSQLtSSISTemplate/TemplateSolution.sln +++ b/tSQLtSSISTemplate/TemplateSolution.sln @@ -11,6 +11,8 @@ Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "TemplateDatabaseTests", "Te 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 Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Azure|Any CPU = Azure|Any CPU @@ -63,6 +65,14 @@ Global {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 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 3d2a504ff8a823c2e73f936e6f7108a45fefcf5f Mon Sep 17 00:00:00 2001 From: mbt1 Date: Fri, 31 Dec 2021 07:00:00 -0500 Subject: [PATCH 5/8] delete and create folders --- .../TemplateSSIS.CI/CreateSSISFolder.sql | 4 +++ .../TemplateSSIS.CI/DeleteSSISFolder.sql | 28 +++++++++++++++++++ .../TemplateSSIS.CI/TemplateSSIS.CI.csproj | 2 ++ 3 files changed, 34 insertions(+) create mode 100644 tSQLtSSISTemplate/TemplateSSIS.CI/CreateSSISFolder.sql create mode 100644 tSQLtSSISTemplate/TemplateSSIS.CI/DeleteSSISFolder.sql 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/TemplateSSIS.CI.csproj b/tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj index 37225ef..1d5b1c8 100644 --- a/tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj +++ b/tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj @@ -49,6 +49,8 @@ + + From 20dc68b870383403bee8d2461525bccedc7a9749 Mon Sep 17 00:00:00 2001 From: mbt1 Date: Sat, 1 Jan 2022 17:56:16 -0500 Subject: [PATCH 6/8] Lots of changes. Now VS_ISBROKEN. --- .../ReferenceObjects/PrepareServer.sql | 191 ++++++ .../ReferenceObjects/ReferenceObjects.sqlproj | 60 ++ .../ReferenceObjects/tSQLt.2019.dacpac | Bin 0 -> 85810 bytes ...Objects.TransformObjectList_GetObjects.sql | 9 + .../TemplateDatabase/SSISObjects.sql | 2 + .../TemplateDatabase/TemplateDatabase.sqlproj | 13 +- .../TemplateDatabaseTests.sqlproj | 27 +- tSQLtSSISTemplate/TemplateSSIS.CI/App.config | 6 + .../Properties/AssemblyInfo.cs | 36 ++ .../TemplateSSIS.CI/TemplateSSIS.CI.csproj | 2 +- .../TemplateSSIS/TemplateSSIS.dtproj | 552 ++++++++++-------- .../TemplateSSIS/TransformObjectList.dtsx | 54 +- .../TemplateSSIS/sourceDB.conmgr | 20 - .../TemplateSSIS/targetDB.conmgr | 20 - .../TemplateSSISTests/RunTests.sql | 1 + .../TemplateSSISTests.sqlproj | 38 +- .../TransformObjectListTests.sql | 36 ++ tSQLtSSISTemplate/TemplateSolution.sln | 14 + 18 files changed, 772 insertions(+), 309 deletions(-) create mode 100644 tSQLtSSISTemplate/ReferenceObjects/PrepareServer.sql create mode 100644 tSQLtSSISTemplate/ReferenceObjects/ReferenceObjects.sqlproj create mode 100644 tSQLtSSISTemplate/ReferenceObjects/tSQLt.2019.dacpac create mode 100644 tSQLtSSISTemplate/TemplateDatabase/SSISObjects.TransformObjectList_GetObjects.sql create mode 100644 tSQLtSSISTemplate/TemplateDatabase/SSISObjects.sql create mode 100644 tSQLtSSISTemplate/TemplateSSIS.CI/App.config create mode 100644 tSQLtSSISTemplate/TemplateSSIS.CI/Properties/AssemblyInfo.cs delete mode 100644 tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr delete mode 100644 tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr create mode 100644 tSQLtSSISTemplate/TemplateSSISTests/RunTests.sql create mode 100644 tSQLtSSISTemplate/TemplateSSISTests/TransformObjectListTests.sql 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 0000000000000000000000000000000000000000..9d0101e24d43f1152c0e47fc4c0195365dfa5287 GIT binary patch literal 85810 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 z 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

?*(rQ6B3S6m5)Y@hv?6Sn(k|1jpxBTbw|3gD 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 XHO|zt<2T=u+&AF$60YjwE%^H{k6jR* literal 0 HcmV?d00001 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 index 6779a37..cd3a80d 100644 --- a/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj +++ b/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj @@ -7,7 +7,7 @@ 2.0 4.1 {23a6e107-9ab3-4f27-8365-1c5c19147e94} - Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider + Microsoft.Data.Tools.Schema.Sql.Sql150DatabaseSchemaProvider Database @@ -57,4 +57,15 @@ + + + + + + + $(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\150\SqlSchemas\master.dacpac + False + master + + \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj b/tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj index 61cff22..29d89ea 100644 --- a/tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj +++ b/tSQLtSSISTemplate/TemplateDatabaseTests/TemplateDatabaseTests.sqlproj @@ -7,7 +7,7 @@ 2.0 4.1 {2c86a7b1-bd0e-4aa2-aaa6-9df8b515df2a} - Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider + Microsoft.Data.Tools.Schema.Sql.Sql150DatabaseSchemaProvider Database @@ -57,4 +57,29 @@ + + + ..\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/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/TemplateSSIS.CI.csproj b/tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj index 1d5b1c8..d803a3e 100644 --- a/tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj +++ b/tSQLtSSISTemplate/TemplateSSIS.CI/TemplateSSIS.CI.csproj @@ -5,7 +5,7 @@ Debug AnyCPU {52EFCC53-D796-4C8D-85E7-43DA7A3FFCED} - Exe + Library TemplateSSIS.CI TemplateSSIS.CI v4.7.2 diff --git a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj index c62aacf..0e5e600 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj +++ b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj @@ -26,259 +26,15 @@ DESKTOP-4IR3L3D - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAACLagM8yK+E2q54vOIoAP+AAAAAACAAAAAAAQZgAAAAEAACAAAACCcLbroAQRoM+xzs2wzOhZp7rYvF/EIe2BXnsrh5fwKwAAAAAOgAAAAAIAACAAAACpWD7c8ZMCxuFqQ6drTYnIyZ9OYaBsBAnUSNnWEstPeZAAAADahGxSnzIcCnMrmQMIU1iJbCex8+FLBAEzS6onuzLAdEbYJ/HsjK+9WW/uo0pycLgvbToPXuFZCLh6vF/daOtUQPmfBTn4K4Wdnc8OZrx67KxGhew0AKxQCaCSkIokIeDkA6u50tKTCVf4SKozaVU40T/3wTK71VnlEX/GFJytQvc8tgR36cjE8BKLVSk/lzpAAAAAkR12n0ps6WTgkG96ssI1I/CRPbCwzLP5ecc22dV5FrR/FVxQqZElHpXej+Wf9mub/gtOzQR9Tk47UYJ3fQoKvQ== + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAACLagM8yK+E2q54vOIoAP+AAAAAACAAAAAAAQZgAAAAEAACAAAABKab229mlALYwgXhpuyyJ+RerjKxsLDQ5P3XkTbFvJpwAAAAAOgAAAAAIAACAAAACjaOfH1Nlut9Mdd+KTwcXMD6PoHVUL/ZeV/GyV0rVV6JAAAAAJOkNt2wdjzfzMGtBIlwcE+gmk/eoiCVVvng9CU8S/qXhxZxEeRLQqL04tHtlA85nOtvj4EW3Rb6SPnJ3uLIbDnCJz8JOtb6i8p8X0ORah0yL0t4+A8pA/GKKEq/ExZbmWulS4NL+x76JhauYXhvS3w2qR5Pcj7vsy+fl5iqe0JSi6QZkl/VTtQLKnCwsJ2QNAAAAAHoa8xkJlNdrFeY59z9swBGw2B76q2LohXqKpaLlG3LXBvIFNv3QzanmbXC+SPbK4NadvdEjhEjW5DxGNwFoOiA== 1 - - - - + - - - - - - - - - - 0 - 0 - 0 - false - 3 - - - - - - - - - - - 0 - 0 - 0 - 1 - 9 - - - - - - - - - - - 0 - 0 - 0 - 5 - 9 - - - - - - - - - - - 0 - 0 - 0 - false - 3 - - - - - - - - - - - 0 - 0 - 0 - tSQLt_Dev - 18 - - - - - - - - - - - 0 - 0 - 0 - false - 3 - - - - - - - - - - - 0 - 0 - 0 - .,41433 - 18 - - - - - - - - - - - 0 - 0 - 0 - tSQLt_sa - 18 - - - - - - - - - - - 0 - 0 - 0 - false - 3 - - - - - - - - - - - 0 - 0 - 0 - 1 - 9 - - - - - - - - - - - 0 - 0 - 0 - 5 - 9 - - - - - - - - - - - 0 - 0 - 0 - false - 3 - - - - - - - - - - - 0 - 0 - 0 - tSQLt_Dev - 18 - - - - - - - - - - - 0 - 0 - 0 - false - 3 - - - - - - - - - - - 0 - 0 - 0 - .,41433 - 18 - - - - - - - - - - - 0 - 0 - 0 - tSQLt_sa - 18 - - - + @@ -286,10 +42,10 @@ TransformObjectList 1 0 - 8 + 11 - {C29636C6-E92A-4014-A0CA-F5D68231EC9F} + {001780B2-9EFB-4161-B349-CDC6DBB12040} 8 @@ -306,7 +62,303 @@ 0 0 0 - select name, SCHEMA_NAME(schema_id) SchemaName, QUOTENAME(SCHEMA_NAME(schema_id)) QuotedSchemaName, QUOTENAME(name) QuotedName from sys.objects + SELECT * FROM SSISObjects.TransformObjectList_GetObjects; + 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 + 0 + tSQLt_SSISTemplate + 18 + + + + + + + + + + + 0 + 0 + 1 + 18 + + + + + + + + + + + 0 + 0 + 0 + false + 3 + + + + + + + + + + + 0 + 0 + 0 + .,42419 + 18 + + + + + + + + + + + 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 + 0 + tSQLt_SSISTemplate + 18 + + + + + + + + + + + 0 + 0 + 1 + 18 + + + + + + + + + + + 0 + 0 + 0 + false + 3 + + + + + + + + + + + 0 + 0 + 0 + .,42419 + 18 + + + + + + + + + + + 0 + 0 + 0 18 diff --git a/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx index 662cb79..4f02717 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx +++ b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx @@ -11,10 +11,36 @@ DTS:LocaleID="1033" DTS:ObjectName="TransformObjectList" DTS:PackageType="5" - DTS:VersionBuild="9" - DTS:VersionGUID="{3E3F0B75-1B49-4F1C-BD35-37C566D6E2F6}"> + DTS:VersionBuild="12" + DTS:VersionGUID="{AC967867-F36C-4900-A3E1-73E6D4D2CB7D}"> 8 + + + + + + + + + + + + select name, SCHEMA_NAME(schema_id) SchemaName, QUOTENAME(SCHEMA_NAME(schema_id)) QuotedSchemaName, QUOTENAME(name) QuotedName from sys.objects + DTS:Name="ParameterValue">SELECT * FROM SSISObjects.TransformObjectList_GetObjects; @@ -100,8 +126,8 @@ @@ -220,7 +246,7 @@ + name="OpenRowset">[SSISObjects].[TransformObjectList_GetObjects] 3 + typeConverter="AccessMode">0 @@ -494,7 +520,7 @@ @@ -506,15 +532,15 @@ TableInfoObjectType Table + type="q2:string">View diff --git a/tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr b/tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr deleted file mode 100644 index 4111189..0000000 --- a/tSQLtSSISTemplate/TemplateSSIS/sourceDB.conmgr +++ /dev/null @@ -1,20 +0,0 @@ - - - @[$Project::SourceDB_ConnectionString] - @[$Project::SourceDB_Password] - - - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAABYwKz6gZ7RfWLbmZsknl7wPO17+ZHRhj1AgSbrKwn3UgAAAAAOgAAAAAIAACAAAAC6PKgRRxZl9kDGlYGupxMMY07mtd/roBoWRSwd5O4hOIAAAADlMVwiNZuapPuZUDDmX25LYRkYr+dzwYA0qmM0VzCDQlW5i1NXOQMDSOPVROapevORPHnL/AZZTnRIvoNVAdUJ5ugvhfDySEQGZEg48EKR2dc9ld5U1nUg3BfnNSfPUllHDbvr85OrRiGvAr2CTCLqWMWUvT22rv/c2wb7hNmOwEAAAACGABY3E7rD3Nwa45IozfId9eEOPK+LiM27nSY37WIBBBbHj1RuKP7nswooW2b9aH8ETA2q2Vu1OxZAHO9LeK/z - - - \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr b/tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr deleted file mode 100644 index 194f5ec..0000000 --- a/tSQLtSSISTemplate/TemplateSSIS/targetDB.conmgr +++ /dev/null @@ -1,20 +0,0 @@ - - - @[$Project::TargetDB_ConnectionString] - @[$Project::TargetDB_Password] - - - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAAD/VyeTFM74G1aE/rw5kCgjrlsxawth1wAtDwvJdVb4hwAAAAAOgAAAAAIAACAAAABZcJa9cilNWWx06VjIdGSHUje3UgR6VEE6KfiEBY3OCIAAAADdmvwoziph4C2LU/5E6IQAbzNQCIvXPBIjFus8hPwPxtjH8TpW529nFRjXhIODcbTkh4KfZILa9PI+3Ce68bj5TVxxQn785OfFiAM+3uZgS8mz3KUBuGD6nj4pcnpLFbZhloichphuL8MMqKKA7SaiM70LFS9u8skYLpvOFC2EukAAAADL+6/CTgKTLFTFkb5oPcHhn679vcCdK2EnaHVErsqIaHh4SGy/t3zngVCkREEv8kuHw/sFpLAZeFJeL5mJ98Hh - - - \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSSISTests/RunTests.sql b/tSQLtSSISTemplate/TemplateSSISTests/RunTests.sql new file mode 100644 index 0000000..f75ed01 --- /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 index 83f9738..2a19072 100644 --- a/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj +++ b/tSQLtSSISTemplate/TemplateSSISTests/TemplateSSISTests.sqlproj @@ -7,7 +7,7 @@ 2.0 4.1 {c01b58d3-06d7-43b1-9514-8131c3935d0b} - Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider + Microsoft.Data.Tools.Schema.Sql.Sql150DatabaseSchemaProvider Database @@ -58,6 +58,40 @@ - + + + + + ..\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..1cf8261 --- /dev/null +++ b/tSQLtSSISTemplate/TemplateSSISTests/TransformObjectListTests.sql @@ -0,0 +1,36 @@ +CREATE SCHEMA TransformObjectListTests AUTHORIZATION [tSQLt.TestClass] +GO +CREATE PROCEDURE TransformObjectListTests.[test SSIS is cool] +AS +BEGIN + DECLARE @package_name nvarchar(200) = N'TransformObjectList.dtsx'; + DECLARE @project_name nvarchar(200) = N'TemplateSSIS'; + DECLARE @folder_name nvarchar(200) = N'TestFolder'; + + -- SSIS Execution Parameters + DECLARE @execution_id bigint; + DECLARE @reference_id smallint = 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 */ + /**********************************************************/ + + 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; + + 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 \ No newline at end of file diff --git a/tSQLtSSISTemplate/TemplateSolution.sln b/tSQLtSSISTemplate/TemplateSolution.sln index 3178382..bd2c70d 100644 --- a/tSQLtSSISTemplate/TemplateSolution.sln +++ b/tSQLtSSISTemplate/TemplateSolution.sln @@ -13,6 +13,8 @@ Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "TemplateSSISTests", "Templa 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 @@ -73,6 +75,18 @@ Global {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 From d770ce55e206d1fa30c14abe0df560b63bd20a80 Mon Sep 17 00:00:00 2001 From: mbt1 Date: Sun, 2 Jan 2022 08:33:08 -0500 Subject: [PATCH 7/8] It worked - kind of. and only once. --- .../TemplateDatabase/TemplateDatabase.sqlproj | 1 + .../TransformedObjectList.sql | 8 +++++ .../TemplateSSIS/TransformObjectList.dtsx | 16 ++++----- .../TransformObjectListTests.sql | 34 +++++++++++++++---- 4 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 tSQLtSSISTemplate/TemplateDatabase/TransformedObjectList.sql diff --git a/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj b/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj index cd3a80d..dd7489c 100644 --- a/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj +++ b/tSQLtSSISTemplate/TemplateDatabase/TemplateDatabase.sqlproj @@ -60,6 +60,7 @@ + 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/TemplateSSIS/TransformObjectList.dtsx b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx index 4f02717..8be394b 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx +++ b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx @@ -11,8 +11,8 @@ DTS:LocaleID="1033" DTS:ObjectName="TransformObjectList" DTS:PackageType="5" - DTS:VersionBuild="12" - DTS:VersionGUID="{AC967867-F36C-4900-A3E1-73E6D4D2CB7D}"> + DTS:VersionBuild="14" + DTS:VersionGUID="{036B9E8E-B87C-4A66-A4CE-E85FABC28E5E}"> 8 @@ -83,7 +83,7 @@ [OLE DB Destination] + name="OpenRowset">[dbo].[TransformedObjectList] + TopLeft="88.86111111663,176.344445468408"> + End="0,77.900001012484"> + End="0,77.900001012484" /> diff --git a/tSQLtSSISTemplate/TemplateSSISTests/TransformObjectListTests.sql b/tSQLtSSISTemplate/TemplateSSISTests/TransformObjectListTests.sql index 1cf8261..8fac816 100644 --- a/tSQLtSSISTemplate/TemplateSSISTests/TransformObjectListTests.sql +++ b/tSQLtSSISTemplate/TemplateSSISTests/TransformObjectListTests.sql @@ -1,15 +1,18 @@ CREATE SCHEMA TransformObjectListTests AUTHORIZATION [tSQLt.TestClass] GO +--[@tSQLt:NoTransaction](DEFAULT) CREATE PROCEDURE TransformObjectListTests.[test SSIS is cool] AS BEGIN - DECLARE @package_name nvarchar(200) = N'TransformObjectList.dtsx'; - DECLARE @project_name nvarchar(200) = N'TemplateSSIS'; - DECLARE @folder_name nvarchar(200) = N'TestFolder'; + 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 smallint = null; + DECLARE @reference_id bigint = null; -- SSIS Catalog Variables (object_type = 50) DECLARE @logging_level smallint = 3; @@ -25,12 +28,31 @@ BEGIN /* Run the SSIS Package */ /**********************************************************/ - 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; +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 + SELECT @execution_id 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; + + EXEC [SSISDB].[catalog].[start_execution] @execution_id + + END; GO \ No newline at end of file From 601dda2859b9fe275f40d7ed81e4b04f232cd0e0 Mon Sep 17 00:00:00 2001 From: mbt1 Date: Sun, 6 Feb 2022 15:52:28 -0500 Subject: [PATCH 8/8] noodling with connection strings. They still don't work exactly. --- tSQLtSSISTemplate/TemplateSSIS/Project.params | 49 +++-------- .../TemplateSSIS/TemplateSSIS.dtproj | 81 +------------------ .../TemplateSSIS/TransformObjectList.dtsx | 12 ++- .../TemplateSSISTests/RunTests.sql | 2 +- .../TransformObjectListTests.sql | 32 ++++++-- 5 files changed, 52 insertions(+), 124 deletions(-) diff --git a/tSQLtSSISTemplate/TemplateSSIS/Project.params b/tSQLtSSISTemplate/TemplateSSIS/Project.params index 88272ae..6eb907c 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/Project.params +++ b/tSQLtSSISTemplate/TemplateSSIS/Project.params @@ -1,10 +1,10 @@  + SSIS:Name="TargetDB_InitialCatalog"> {33cc45ca-2878-4b50-9895-a9b96afb0b9e} + SSIS:Name="ID">{5ca98efc-d874-4151-bfb6-ed53d5f8396e} 0 1 + SSIS:Name="Required">0 0 Data Source=.,41433;User ID=tSQLt_sa;Initial Catalog=tSQLt_Dev;Provider=SQLNCLI11.1;Auto Translate=False; + SSIS:Name="Value">tSQLt_SSISTemplate 18 + SSIS:Name="TargetDB_ServerName"> {b62f29a8-a656-495a-b0be-e9eeb0e214ee} + SSIS:Name="ID">{e4223dcd-5ffe-42e2-919d-d9ded7f79189} 0 1 + SSIS:Name="Required">0 0 Data Source=.,41433;User ID=tSQLt_sa;Initial Catalog=tSQLt_Dev;Provider=SQLNCLI11.1;Application Name=TargetDBConnection;Auto Translate=False; + SSIS:Name="Value">.,42419 18 - - {f1f1ba35-addc-4104-a90f-3214904570eb} - - - 0 - 1 - 1 - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAABrVSCAtFlXo3pzwii0lfTBjw1lsMZJBXBVR/pJDrmfxAAAAAAOgAAAAAIAACAAAABAQyeT4ji6/6l9r8jKPgdkUMYeNK4+splwUJ1bLSvsHYAAAADQFUuFZk6alsmbJPMi9yFVvf1LsjSAGaj5ZhPk5s1Cxitiq4bHQQeEDdGPVEKDshGQASBKE04G1VJM68WFYHUEWpTP4YMoReV3TXDc3y5zwxGsmwOU1uVxS3h2eJRX3XRXKRnJo2SOK6b/Lv+k+5OWMlD7qnD16GiWwTB0me+k4kAAAAB7MycME58LizAYHkxN4Nd5Cvbnma5tKhFzqrHX5LD4MSy9M+ixNur7dlwScl7SHLiXbbkX7B1Hd2mMwXKdx/GK - 18 - - - + SSIS:Name="SourceDB_ConnectionString"> {94d8127a-e18d-4e19-aba6-5bb4bd2bf34d} + SSIS:Name="ID">{cc1ba36a-d090-481d-83d7-6c7d69384db6} 0 1 + SSIS:Name="Required">0 1 + SSIS:Name="Sensitive">0 AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKFXbBc36KkGV38YQYb7UPgAAAAACAAAAAAAQZgAAAAEAACAAAACXEyoewIeBKzBK/ELLwRp+RIHIlNKhaiqTfmntoHb1xwAAAAAOgAAAAAIAACAAAAAgzGaw4hDmAmRKmTw8/02lv7SjZmUig/H6qySaN7cW4IAAAADp6P/hxyxqBsc/1siBRINJGSBaB9r2G/GlcTw/4WmILuIDp02+0ismyFHxjA5nUKtfNKvEXyoCypsqZ6N6F8dWxsFT49oBXSOGEZK8xqvFNxJmcWEvN47f8fw6aPrkV/VEwJwxJs9xv2AHHK9CZb5L7Jns3FIsTAZ3QJBnsGeAzUAAAABGftiUW9fGMFevIpNvF5rZuSa7U9z9Cp9jM3YS2BDtez+CSafNO/ZvkExDC/aogZ0N78UDWU3DKeG1DtUhX+iv + SSIS:Name="Value">Data Source=.,42419;Initial Catalog=tSQLt_SSISTemplate;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False; 18 diff --git a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj index 0e5e600..a4de0f8 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj +++ b/tSQLtSSISTemplate/TemplateSSIS/TemplateSSIS.dtproj @@ -26,7 +26,7 @@ DESKTOP-4IR3L3D - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAACLagM8yK+E2q54vOIoAP+AAAAAACAAAAAAAQZgAAAAEAACAAAABKab229mlALYwgXhpuyyJ+RerjKxsLDQ5P3XkTbFvJpwAAAAAOgAAAAAIAACAAAACjaOfH1Nlut9Mdd+KTwcXMD6PoHVUL/ZeV/GyV0rVV6JAAAAAJOkNt2wdjzfzMGtBIlwcE+gmk/eoiCVVvng9CU8S/qXhxZxEeRLQqL04tHtlA85nOtvj4EW3Rb6SPnJ3uLIbDnCJz8JOtb6i8p8X0ORah0yL0t4+A8pA/GKKEq/ExZbmWulS4NL+x76JhauYXhvS3w2qR5Pcj7vsy+fl5iqe0JSi6QZkl/VTtQLKnCwsJ2QNAAAAAHoa8xkJlNdrFeY59z9swBGw2B76q2LohXqKpaLlG3LXBvIFNv3QzanmbXC+SPbK4NadvdEjhEjW5DxGNwFoOiA== + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAACLagM8yK+E2q54vOIoAP+AAAAAACAAAAAAAQZgAAAAEAACAAAAAXS9dPfWOwWAJ3HDes94wLfaK8xBG0VtzA4/c6YNOW9gAAAAAOgAAAAAIAACAAAAA7oELFhoFG/gzFESKylRO62a1uJ+92oZ7fj54wfxMzI5AAAABwu5xD1GanZzsmadm5Ty8QBF3wGY1gMQy9oFXxp438/g+Msk262EF3qiEkZAqLk20QmfXXkWz4az0Q2SKCs7zmpicc+1PlzRwF1MiRShtGjDBIktYOcZAyjAKn231GOWAjpfOCzFSnk4hHK+VmkLOXkqMvI0y9C2HAwa4oMAHvIRfYxJdqri06cptjFuMqnUBAAAAA+16TNg01+eEs4bAmvxmwX/Z7wLR79k8eLXUYiDkFipLNO1sMPBdWsncJ9xJT8sUbNLlbToBhdsoy5REE2mjLSA== 1 @@ -42,10 +42,10 @@ TransformObjectList 1 0 - 11 + 23 - {001780B2-9EFB-4161-B349-CDC6DBB12040} + {8DA0A6E0-76D5-49C3-AB1F-069B9217E569} 8 @@ -81,21 +81,6 @@ 3 - - - - - - - - - 0 - 0 - 0 - Data Source=.,42419;Initial Catalog=tSQLt_SSISTemplate;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False; - 18 - - @@ -141,21 +126,6 @@ 3 - - - - - - - - - 0 - 0 - 0 - tSQLt_SSISTemplate - 18 - - @@ -185,21 +155,6 @@ 3 - - - - - - - - - 0 - 0 - 0 - .,42419 - 18 - - @@ -289,21 +244,6 @@ 3 - - - - - - - - - 0 - 0 - 0 - tSQLt_SSISTemplate - 18 - - @@ -333,21 +273,6 @@ 3 - - - - - - - - - 0 - 0 - 0 - .,42419 - 18 - - diff --git a/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx index 8be394b..cb354a2 100644 --- a/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx +++ b/tSQLtSSISTemplate/TemplateSSIS/TransformObjectList.dtsx @@ -11,16 +11,18 @@ DTS:LocaleID="1033" DTS:ObjectName="TransformObjectList" DTS:PackageType="5" - DTS:VersionBuild="14" - DTS:VersionGUID="{036B9E8E-B87C-4A66-A4CE-E85FABC28E5E}"> + DTS:VersionBuild="23" + DTS:VersionGUID="{8DA0A6E0-76D5-49C3-AB1F-069B9217E569}"> 8 + @[$Project::SourceDB_ConnectionString] + @[$Project::TargetDB_InitialCatalog] + @[$Project::TargetDB_ServerName]