{"id":2882,"date":"2016-05-20T00:45:21","date_gmt":"2016-05-20T00:45:21","guid":{"rendered":"http:\/\/bicortex.com\/?p=2882"},"modified":"2016-05-27T02:31:15","modified_gmt":"2016-05-27T02:31:15","slug":"designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-1","status":"publish","type":"post","link":"http:\/\/bicortex.com\/bicortex\/designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-1\/","title":{"rendered":"Designing data acquisition framework in SQL Server and SSIS \u2013 how to source and integrate external data for a decision support system or data warehouse (Part 1)"},"content":{"rendered":"<p style=\"text-align: justify;\">Note: Part 2 to this series can be found <a href=\"http:\/\/bicortex.com\/designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-2\/\" target=\"_blank\">HERE<\/a>, Part 3 <a href=\"http:\/\/bicortex.com\/designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-3\/\" target=\"_blank\">HERE<\/a>, Part 4 <a href=\"http:\/\/bicortex.com\/designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-4\/\" target=\"_blank\">HERE <\/a>and all the code and additional files for this post can be downloaded from my OneDrive folder <a href=\"https:\/\/onedrive.live.com\/redir?resid=715AEF07A82832E1!60083&amp;authkey=!AFYnKHXMHLSfr5Q&amp;ithint=folder%2c\" target=\"_blank\">HERE<\/a><\/p>\n<h3 style=\"text-align: center;\"><strong>Introduction<\/strong><\/h3>\n<p style=\"text-align: justify;\">There is a lot of literature and Internet resources on the subject of data warehouse and decision support systems architecture, including considerations for Kimbal vs Inmon approach, data storage and management systems vendor options, RDBMS vs NoSQL arguments etc., however, in a typical small-to-medium enterprise environment, the first step to creating a data warehouse is designing a data acquisition job to move the source data into a staging area. Providing the most prevalent approach to data warehouse design is employed i.e. no near-real time or streaming architecture is required, the staging server\/database, storing a\u00a0copy of a transactional system data for further processing and transformations\u00a0is created and populated in the first instance.<\/p>\n<p style=\"text-align: justify;\">Most of the time, sourcing transactional data and placing its copy on the staging database simply involves a full or delta copy from the operational system(s) data into the staging database. There is typically no schema denormalisation involved at this stage but data cleansing routines can be employed to make data cleaner and conforming to business definitions e.g. missing values substitution, data types conversion, de-duplication etc. Sometimes, certain degree of &#8216;pruning&#8217; may be employed to separate redundant and information-poor data from data which can be turned into insight, thus competitive advantage. Also, since the advent of cloud providers\/services, with their huge on-demand and cost-competitive processing and storage capabilities, ELT (extract, load and transform), rather than ETL (extract, transform and load) approach may be more applicable for some scenarios. These may include dealing with large volumes of data e.g. generated by a variety of dispersed systems such as IoT devices or operating on a database engine designed for fast, high-concurrency data processing e.g. massively parallel processing (MPP) engine. Therefore, depending on how much you would like to massage the data before it finds its way into the landing\/staging area, data acquisition can either become as simple as a like-for-like, source-to-target copying or as complex as an intricate collection of transformations, mostly to deal with data quality and deluge issues.<\/p>\n<p style=\"text-align: justify;\">To demonstrate a sample workflow for a data acquisition job of moderate complexity and data volume I will describe a sample SQL Server Integration Services (SSIS) package which anyone versed enough in T-SQL and SSIS can replicate and modify according to the project and business needs. This package has been &#8216;taken out&#8217; of one of my previous client\u2019s environment and can serve as a template for sourcing transactional data into a staging database for further processing and massaging. To make this example more akin to a typical business scenario and more flexible for future reuse I have deliberately assumed the following:<\/p>\n<ul>\n<li style=\"text-align: justify;\">The\u00a0source data is running outside local network on a database supported by vendor other than Microsoft i.e. MySQL therefore specific data incompatibilities e.g. data types, numeric precisions, character maximum lengths etc. are likely to occur and need to be rectified automatically in the process of acquisition. For the sake of completeness, I will also include the code altered version for SQL Server-to-SQL Server data acquisition<\/li>\n<li style=\"text-align: justify;\">The\u00a0source database schema is under constant development so target database, where the acquired data is stored, needs to be adjusted automatically. Alterations such as schema changes for existing tables e.g. column names, data types, numeric precision and scale etc. need to be reconciled without developers\u2019 intervention as part of the pre-acquisition tasks<\/li>\n<li style=\"text-align: justify;\">In\u00a0case any connectivity issues occur, the job will wait for a predefined period of time in a loop also executed a predefined number of times before reporting failed connectivity status<\/li>\n<li style=\"text-align: justify;\">Any\u00a0errors raised need to be logged and stored for reference but halting the entire process should not be the default behaviour in case of a single table failure. When exception is raised, the process should not stop, but rather gracefully log the error details and continue to synchronise the remaining objects<\/li>\n<li style=\"text-align: justify;\">In\u00a0case of any issues encountered, we need the administrator(s) to be notified<\/li>\n<li style=\"text-align: justify;\">Any\u00a0indexes will be dealt with as needed i.e. dropped\/recreated, reorganised etc. Statistics will also be refreshed at the end of the process<\/li>\n<li style=\"text-align: justify;\">Some\u00a0source data (small tables) can be merged and others (larger tables) require source truncation and full table being copied across (no row per row comparison)<\/li>\n<li style=\"text-align: justify;\">We\u00a0should be able to \u2018turn on&#8217; and &#8216;turn off\u2019 which tables and which columns from each table will be brought across e.g. some may contain irrelevant or sensitive data which is not required to be copied across<\/li>\n<li style=\"text-align: justify;\">At\u00a0the job completion we will have some rudimentary checks to compare source to target data e.g. record count for each table and check for any errors logged<\/li>\n<\/ul>\n<p>Conceptually, the\u00a0acquisition process and its core components can be depicted as per the image below.<\/p>\n<p><a href=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_HighLevel_Architecture_Diagram.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2915\" src=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_HighLevel_Architecture_Diagram.png\" alt=\"Data_Acquisition_Framework_Part1_HighLevel_Architecture_Diagram\" width=\"580\" height=\"479\" srcset=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_HighLevel_Architecture_Diagram.png 865w, http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_HighLevel_Architecture_Diagram-300x248.png 300w, http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_HighLevel_Architecture_Diagram-768x635.png 768w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">At a lower level, this framework blueprint will become much more involved as there is quite a bit of code to account for each of the step\u2019s functionality, however, at a higher level, all tasks involved can be roughly divided into three categories.<\/p>\n<ul>\n<li style=\"text-align: justify;\">Pre-acquisition tasks \u2013 activities which facilitate subsequent data coping e.g. source server availability checking, schema modifications check, pre-load indexes management etc.<\/li>\n<li style=\"text-align: justify;\">Acquisition tasks \u2013 tasks which are directly responsible for source-to-target data coping<\/li>\n<li style=\"text-align: justify;\">Post-acquisition tasks \u2013 activities which ensure post-load validation e.g. statistics refresh, indexes re-creation\/rebuild\/re-organisation, error logs check etc.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Transactional systems data sourcing and staging can be as straightforward as simply selecting source data and inserting it into pre-created table, however, it is always prudent to assume that, for example, changes to the source or target data\/schema\/environment will not always be communicated or that source system will not always be available for querying and take measures to prevent the process from falling over. From my experience, developers are not always diligent about relying database changes information up-steam and on a lot of occasions I have witnessed even larger modifications being dismissed as not having any impact on the decision support systems, sometimes resulting in business being deprived of data for days or longer. To prevent situations where data could not be sourced reliably, it is always better to assume the worst and hope for the best so in the spirit of following best practice standards I will break this post into four parts, each dealing with their respective phases of development process i.e.<\/p>\n<ul>\n<li style=\"text-align: justify;\">Building\u00a0the supporting scaffolding i.e. creating support databases and database objects, setting up linked server connection to the source data etc. \u2013 this post<\/li>\n<li style=\"text-align: justify;\">Pre-acquisition activities e.g. source server availability checking, schema modifications check etc. as well as large tables acquisition code development and overview \u2013 <a href=\"http:\/\/bicortex.com\/designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-2\/\" target=\"_blank\">Part 2<\/a><\/li>\n<li style=\"text-align: justify;\">Post-acquisition activities e.g. statistics refresh, error log check etc. as well as small tables acquisition code development and overview \u2013 <a href=\"http:\/\/bicortex.com\/designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-3\/\" target=\"_blank\">Part 3<\/a><\/li>\n<li style=\"text-align: justify;\">SSIS\u00a0package structure and final conclusion \u2013 <a href=\"http:\/\/bicortex.com\/designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-4\/\" target=\"_blank\">Part 4<\/a><\/li>\n<\/ul>\n<p style=\"text-align: justify;\">As previously mentioned, the acquisition package (template) this blog series describes is logically comprised of three sections: pre-acquisition activities, data acquisition tasks and post-acquisition activities. At a high level, the package control flow may look as per image below.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_PseudoPackage_Workflow_View.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2900\" src=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_PseudoPackage_Workflow_View.png\" alt=\"Data_Acquisition_Framework_Part1_PseudoPackage_Workflow_View\" width=\"580\" height=\"1029\" srcset=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_PseudoPackage_Workflow_View.png 746w, http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_PseudoPackage_Workflow_View-169x300.png 169w, http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_PseudoPackage_Workflow_View-577x1024.png 577w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Please note that this template, along with its individual tasks is only a guide and if any of the steps are not applicable or are excluded and should be added to conform to technical requirements, it should be fairly straightforward to alter it with little effort. This post will deal with the first step in this process i.e. creating all auxiliary structure to support further code and package development outlined in part 2, part 3 and part 4.<\/p>\n<h3 style=\"text-align: center;\">Environment and Supporting Objects Setup<\/h3>\n<p style=\"text-align: justify;\">Let\u2019s begin by setting the stage to the rest of this series and create all necessary scaffolding i.e. staging database, control database and AdminDBA database (more on that later), linked server to the source database etc.<\/p>\n<p style=\"text-align: justify;\">Firstly, let\u2019s create two databases \u2013 ControlDB and StagingDB \u2013 and the associated objects\/data. StagingDB database will simply act as a local copy of the source data. Control database, on the other hand, will hold tables controlling data acquisition objects metadata e.g. tables and fields exceptions in case we want to exclude certain columns from the process, indexes names in case we want to drop and rebuild them, information on whether the source table is large or small (this dependency will trigger different acquisition process), notification recipients\u2019 e-mail addresses etc. One can omit creating control database and circumvent dealing with this metadata by hard-coding it into the stored procedures directly, however, in my experience, it is a worthwhile feature to have as changes\/additions can be applied to a single repository transparently and effortlessly e.g. excluding one or more attributes from a source table is a simple INSERT (into control table) statement. I will demonstrate this functionality in more details in part 2 and 3.<\/p>\n<p style=\"text-align: justify;\">As part of this task we will also create all database objects and populate them with test data. You can notice that the code below creates four tables (on ControlDB database) and two views (on StagingDB database). Each of those objects\u2019 functionality is described as per below:<\/p>\n<ul>\n<li style=\"text-align: justify;\">Ctrl_RemoteSvrs_Tables2Process \u2013 metadata table holding objects names and their corresponding environment variables e.g. schema names (both remote and local servers), database names (both remote and local servers), whether the table is active, whether the data volume\/record count is large or not etc. This table\u2019s content dictates which acquisition process should be used for data coping i.e. dynamic MERGE SQL statement (see <a href=\"http:\/\/bicortex.com\/designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-3\/\" target=\"_blank\">part 3<\/a> for details) or parallelised INSERTs (see <a href=\"http:\/\/bicortex.com\/designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-2\/\" target=\"_blank\">part 2<\/a> for details) as well as providing some basic metadata information<\/li>\n<li style=\"text-align: justify;\">Ctrl_RemoteSvrs_Tables2Process_ColumnExceptions \u2013 metadata table containing objects attributes which are not to be acquired from the source database\/server for data redundancy or security reasons. This table may be referenced if any particular object on the source server contains columns which can be excluded, saving space and reducing security concerns<\/li>\n<li style=\"text-align: justify;\">Ctrl_INDXandPKs2Process \u2013 control table containing indexes metadata which stores information on the indexes types, objects they\u2019re built on, columns they\u2019re encompassing etc.<\/li>\n<li style=\"text-align: justify;\">Ctrl_ErrorMsg_Notification_List \u2013 control table containing email addresses distribution list for error massages notifications and associated metadata. This table is referenced to build a list of addresses which should be notify in case of unexpected event occurrence<\/li>\n<li style=\"text-align: justify;\">vw_MySQLReservedWords \u2013 a view containing a list of MySQL reserved words to allow for MySQL syntax compliance by means of substituting certain key words with a delimited version e.g. replacing words such as AS, CHAR or COLUMN with `AS`, `CHAR` and `COLUMN` equivalents (delimited by backticks)<\/li>\n<li style=\"text-align: justify;\">vw_MSSQLReservedWords \u2013 a view containing a list of SQL Server reserved words. Same purpose as the one above but targeting SQL Server version<\/li>\n<\/ul>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n\/*==============================================================================\r\nSTEP 1\r\nCreate Staging and Control databases on the local instance\r\n==============================================================================*\/\r\nUSE &#x5B;master];\r\nGO\r\nIF EXISTS ( SELECT  name\r\n            FROM    sys.databases\r\n            WHERE   name = N'StagingDB' )\r\n    BEGIN\r\n-- Close connections to the StagingDB database\r\n        ALTER DATABASE StagingDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;\r\n        DROP DATABASE StagingDB;\r\n    END;\r\nGO\r\nCREATE DATABASE StagingDB ON PRIMARY\r\n( NAME = N'StagingDB'\r\n, FILENAME = N'C:\\DBFiles\\StagingDB.mdf'\r\n, SIZE = 10MB\r\n, MAXSIZE = 1GB\r\n, FILEGROWTH = 10MB ) LOG ON\r\n( NAME = N'StagingDB_log'\r\n, FILENAME = N'C:\\DBFiles\\StagingDB_log.LDF'\r\n, SIZE = 1MB\r\n, MAXSIZE = 1GB\r\n, FILEGROWTH = 10MB);\r\nGO\r\n--Assign database ownership to login SA\r\nEXEC StagingDB.dbo.sp_changedbowner @loginame = N'SA', @map = false;\r\nGO\r\n--Change the recovery model to BULK_LOGGED\r\nALTER DATABASE StagingDB SET RECOVERY BULK_LOGGED;\r\nGO\r\n\r\nIF EXISTS ( SELECT  name\r\n            FROM    sys.databases\r\n            WHERE   name = N'ControlDB' )\r\n    BEGIN\r\n-- Close connections to the ControlDB database\r\n        ALTER DATABASE ControlDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;\r\n        DROP DATABASE ControlDB;\r\n    END;\r\nGO\r\nCREATE DATABASE ControlDB ON PRIMARY\r\n( NAME = N'ControlDB'\r\n, FILENAME = N'C:\\DBFiles\\ControlDB.mdf'\r\n, SIZE = 10MB\r\n, MAXSIZE = 1GB\r\n, FILEGROWTH = 10MB ) LOG ON\r\n( NAME = N'StagingDB_log'\r\n, FILENAME = N'C:\\DBFiles\\ControlDB_log.LDF'\r\n, SIZE = 1MB\r\n, MAXSIZE = 1GB\r\n, FILEGROWTH = 10MB);\r\nGO\r\n--Assign database ownership to login SA\r\nEXEC ControlDB.dbo.sp_changedbowner @loginame = N'SA', @map = false;\r\nGO\r\n--Change the recovery model to BULK_LOGGED\r\nALTER DATABASE ControlDB SET RECOVERY BULK_LOGGED;\r\nGO\r\n\r\n\/*==============================================================================\r\nSTEP 2\r\nCreate ControlDB database objects\r\n==============================================================================*\/\r\nUSE &#x5B;ControlDB];\r\nGO\r\n\r\n-- Create 'Ctrl_RemoteSvrs_Tables2Process' table\r\nCREATE TABLE &#x5B;dbo].&#x5B;Ctrl_RemoteSvrs_Tables2Process]\r\n    (\r\n      &#x5B;ID] &#x5B;SMALLINT] IDENTITY(1, 1)\r\n                      NOT NULL ,\r\n      &#x5B;Application_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Local_Table_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Local_Schema_Name] &#x5B;VARCHAR](55) NOT NULL ,\r\n      &#x5B;Local_DB_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Remote_Table_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Remote_Schema_Name] &#x5B;VARCHAR](55) NOT NULL ,\r\n      &#x5B;Remote_DB_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Remote_Server_Name] &#x5B;VARCHAR](255) NULL ,\r\n      &#x5B;Is_Active] &#x5B;BIT] NOT NULL ,\r\n      &#x5B;Is_Big_Table] &#x5B;BIT] NOT NULL ,\r\n      CONSTRAINT &#x5B;pk_dbo_ctrl_remotesvrs_tables2process_id] PRIMARY KEY CLUSTERED\r\n        ( &#x5B;ID] ASC )\r\n        WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,\r\n               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,\r\n               ALLOW_PAGE_LOCKS = ON ) ON &#x5B;PRIMARY]\r\n    )\r\nON  &#x5B;PRIMARY];\r\nGO\r\n\r\n--Create 'Ctrl_RemoteSvrs_Tables2Process_ColumnExceptions' table\r\nCREATE TABLE &#x5B;dbo].&#x5B;Ctrl_RemoteSvrs_Tables2Process_ColumnExceptions]\r\n    (\r\n      &#x5B;ID] &#x5B;SMALLINT] IDENTITY(1, 1)\r\n                      NOT NULL ,\r\n      &#x5B;FK_ObjectID] &#x5B;SMALLINT] NOT NULL ,\r\n      &#x5B;Application_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Local_Field_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Local_Table_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Local_Schema_Name] &#x5B;VARCHAR](55) NOT NULL ,\r\n      &#x5B;Local_DB_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Remote_Field_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Remote_Table_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Remote_Schema_Name] &#x5B;VARCHAR](55) NOT NULL ,\r\n      &#x5B;Remote_DB_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Remote_Server_Name] &#x5B;VARCHAR](255) NOT NULL ,\r\n      &#x5B;Exception_Type] &#x5B;VARCHAR](55) NOT NULL ,\r\n      &#x5B;Is_Active] &#x5B;BIT] NOT NULL ,\r\n      CONSTRAINT &#x5B;pk_dbo_ctrl_remotesvrs_tables2process_columnexceptions_id] PRIMARY KEY CLUSTERED\r\n        ( &#x5B;ID] ASC )\r\n        WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,\r\n               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,\r\n               ALLOW_PAGE_LOCKS = ON ) ON &#x5B;PRIMARY]\r\n    )\r\nON  &#x5B;PRIMARY];\r\n\r\nGO\r\n\r\n\r\n-- Create foreign key constraint between \r\n-- 'Ctrl_RemoteSvrs_Tables2Process_ColumnExceptions' and 'Ctrl_RemoteSvrs_Tables2Process' tables\r\nALTER TABLE &#x5B;dbo].&#x5B;Ctrl_RemoteSvrs_Tables2Process_ColumnExceptions]  \r\nWITH CHECK ADD  CONSTRAINT &#x5B;fk_dbo_ctrl_remotesvrs_tables2process_id] FOREIGN KEY(&#x5B;FK_ObjectID])\r\nREFERENCES &#x5B;dbo].&#x5B;Ctrl_RemoteSvrs_Tables2Process] (&#x5B;ID]);\r\nGO\r\n\r\nALTER TABLE &#x5B;dbo].&#x5B;Ctrl_RemoteSvrs_Tables2Process_ColumnExceptions] \r\nCHECK CONSTRAINT &#x5B;fk_dbo_ctrl_remotesvrs_tables2process_id];\r\nGO\r\n\r\n\r\n-- Create 'Ctrl_INDXandPKs2Process' table\r\nCREATE TABLE &#x5B;dbo].&#x5B;Ctrl_INDXandPKs2Process]\r\n    (\r\n      &#x5B;ID] &#x5B;SMALLINT] IDENTITY(1, 1)\r\n                      NOT NULL ,\r\n      &#x5B;Program_Name] &#x5B;VARCHAR](128) NOT NULL ,\r\n      &#x5B;Database_Name] &#x5B;VARCHAR](128) NOT NULL ,\r\n      &#x5B;Schema_Name] &#x5B;VARCHAR](25) NOT NULL ,\r\n      &#x5B;Table_Name] &#x5B;VARCHAR](256) NOT NULL ,\r\n      &#x5B;Index_or_PKName] &#x5B;VARCHAR](512) NOT NULL ,\r\n      &#x5B;Index_Type] &#x5B;VARCHAR](128) NOT NULL ,\r\n      &#x5B;Is_Unique] &#x5B;VARCHAR](56) NULL ,\r\n      &#x5B;Is_PK] &#x5B;VARCHAR](56) NULL ,\r\n      &#x5B;PK_ColNames] &#x5B;VARCHAR](1024) NULL ,\r\n      &#x5B;Indx_ColNames] &#x5B;VARCHAR](1024) NULL ,\r\n\t  &#x5B;Indx_Options] VARCHAR (MAX) NULL,\r\n      CONSTRAINT &#x5B;pk_id_ctrl_indxandpks2process_id] PRIMARY KEY CLUSTERED\r\n        ( &#x5B;ID] ASC )\r\n        WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,\r\n               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,\r\n               ALLOW_PAGE_LOCKS = ON ) ON &#x5B;PRIMARY]\r\n    )\r\nON  &#x5B;PRIMARY];\r\nGO\r\n\r\n\r\n-- Create 'Ctrl_ErrorMsg_Notification_List' table\r\nCREATE TABLE &#x5B;dbo].&#x5B;Ctrl_ErrorMsg_Notification_List]\r\n    (\r\n      &#x5B;ID] &#x5B;INT] IDENTITY(1, 1)\r\n                 NOT NULL ,\r\n      &#x5B;ServerName] &#x5B;VARCHAR](128) NULL ,\r\n      &#x5B;InstanceName] &#x5B;VARCHAR](128) NULL ,\r\n      &#x5B;TaskName] &#x5B;VARCHAR](256) NULL ,\r\n      &#x5B;EmailAddress] &#x5B;VARCHAR](256) NULL ,\r\n      &#x5B;IsActive] &#x5B;BIT] NULL ,\r\n      CONSTRAINT &#x5B;pk_dbo_ctrl_errorMsg_notification_list_id] PRIMARY KEY CLUSTERED\r\n        ( &#x5B;ID] ASC )\r\n        WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,\r\n               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,\r\n               ALLOW_PAGE_LOCKS = ON ) ON &#x5B;PRIMARY]\r\n    )\r\nON  &#x5B;PRIMARY];\r\nGO\r\n\r\n\r\n-- Insert sample data into control objects created \r\nINSERT  INTO &#x5B;dbo].&#x5B;Ctrl_RemoteSvrs_Tables2Process]\r\n        ( Application_Name ,\r\n          Local_Table_Name ,\r\n          Local_Schema_Name ,\r\n          Local_DB_Name ,\r\n          Remote_Table_Name ,\r\n          Remote_Schema_Name ,\r\n          Remote_DB_Name ,\r\n          Remote_Server_Name ,\r\n          Is_Active ,\r\n          Is_Big_Table\r\n        )\r\n        SELECT  'AppName' ,\r\n                'answers' ,\r\n                'dbo' ,\r\n                'StagingDB' ,\r\n                'answers' ,\r\n                'Remote_SchemaName' ,\r\n                'Remote_DBName' ,\r\n                'RemoteMySQLDB' ,\r\n                1 ,\r\n                1\r\n        UNION ALL\r\n        SELECT  'AppName' ,\r\n                'federal_states' ,\r\n                'dbo' ,\r\n                'StagingDB' ,\r\n                'federal_states' ,\r\n                'Remote_SchemaName' ,\r\n                'Remote_DBName' ,\r\n                'RemoteMySQLDB' ,\r\n                1 ,\r\n                0;\r\n\r\nINSERT  INTO dbo.Ctrl_RemoteSvrs_Tables2Process_ColumnExceptions\r\n        ( FK_ObjectID ,\r\n          Application_Name ,\r\n          Local_Field_Name ,\r\n          Local_Table_Name ,\r\n          Local_Schema_Name ,\r\n          Local_DB_Name ,\r\n          Remote_Field_Name ,\r\n          Remote_Table_Name ,\r\n          Remote_Schema_Name ,\r\n          Remote_DB_Name ,\r\n          Remote_Server_Name ,\r\n          Exception_Type ,\r\n          Is_Active\r\n        )\r\n        SELECT  1 ,\r\n                'AppName' ,\r\n                'other_value' ,\r\n                'answers' ,\r\n                'dbo' ,\r\n                'StagingDB' ,\r\n                'other_value' ,\r\n                'answers' ,\r\n                'Remote_Schema_Name' ,\r\n                'Remote_DB_Name' ,\r\n                'RemoteMySQLDB' ,\r\n                'security' ,\r\n                1;\r\n\r\nINSERT  INTO dbo.Ctrl_INDXandPKs2Process\r\n        ( Program_Name ,\r\n          Database_Name ,\r\n          Schema_Name ,\r\n          Table_Name ,\r\n          Index_or_PKName ,\r\n          Index_Type ,\r\n          Is_Unique ,\r\n          Is_PK ,\r\n          PK_ColNames ,\r\n          Indx_ColNames ,\r\n          Indx_Options\r\n        )\r\n        SELECT  'AppName' ,\r\n                'StagingDB' ,\r\n                'dbo' ,\r\n                'answers' ,\r\n                'cstore_nonclustered_idx_dbo_answers_multiplecols' ,\r\n                'CLUSTERED COLUMNSTORE' ,\r\n                '' ,\r\n                '' ,\r\n                '' ,\r\n                'id,oos_id,question_id,question_set_id,answer_provided_by_user_id,answer_option_id,timestamp,oos_questionset_id,owner_user_id' ,\r\n                'WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE )'\r\n        UNION ALL\r\n        SELECT  'AppName' ,\r\n                'StagingDB' ,\r\n                'dbo' ,\r\n                'federal_states' ,\r\n                'nonclustered_idx_dbo_federal_states_name' ,\r\n                'NONCLUSTERED' ,\r\n                '' ,\r\n                '' ,\r\n                '' ,\r\n                'name' ,\r\n                ''\r\n        UNION ALL\r\n        SELECT  'AppName' ,\r\n                'StagingDB' ,\r\n                'dbo' ,\r\n                'answers' ,\r\n                'pk_dbo_answers_id' ,\r\n                'CLUSTERED' ,\r\n                'UNIQUE' ,\r\n                'PRIMARY KEY' ,\r\n                'id' ,\r\n                '' ,\r\n                ''\r\n        UNION ALL\r\n        SELECT  'AppName' ,\r\n                'StagingDB' ,\r\n                'dbo' ,\r\n                'federal_states' ,\r\n                'pk_dbo_federal_states_id' ,\r\n                'CLUSTERED' ,\r\n                'UNIQUE' ,\r\n                'PRIMARY KEY' ,\r\n                'id' ,\r\n                '' ,\r\n                '';\r\n\r\nINSERT  INTO dbo.Ctrl_ErrorMsg_Notification_List\r\n        ( &#x5B;ServerName] ,\r\n          &#x5B;InstanceName] ,\r\n          &#x5B;TaskName] ,\r\n          &#x5B;EmailAddress] ,\r\n          &#x5B;IsActive]\r\n        )\r\n        SELECT  'BICortexTestServer' ,\r\n                'TestSQLServer' ,\r\n                'Data_Acquisition_Job' ,\r\n                'myname@emailaddress.com' ,\r\n                1;\r\n\r\n\/*==============================================================================\r\nSTEP 2\r\nCreate StagingDB database objects\r\n==============================================================================*\/\r\nUSE &#x5B;StagingDB]\r\nGO\r\n\r\nCREATE VIEW &#x5B;dbo].&#x5B;vw_MysqlReservedWords] AS\r\nSELECT 'ACCESSIBLE'\t\t\tAS reserved_word,\t'`ACCESSIBLE`' AS mysql_version\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'ADD',\t\t\t\t\t\t\t\t\t'`ADD`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'ALL',\t\t\t\t\t\t\t\t\t'`ALL`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'ALTER',\t\t\t\t\t\t\t\t\t'`ALTER`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'ANALYZE',\t\t\t\t\t\t\t\t'`ANALYZE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'AND',\t\t\t\t\t\t\t\t\t'`AND`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'AS',\t\t\t\t\t\t\t\t\t'`AS`'\t\t\t\t\t\t\t\t\t\tUNION ALL \t\t\r\nSELECT 'ASC',\t\t\t\t\t\t\t\t\t'`ASC`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'ASENSITIVE',\t\t\t\t\t\t\t'`ASENSITIVE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'BEFORE',\t\t\t\t\t\t\t\t'`BEFORE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'BETWEEN',\t\t\t\t\t\t\t\t'`BETWEEN`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'BIGINT',\t\t\t\t\t\t\t\t'`BIGINT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'BINARY',\t\t\t\t\t\t\t\t'`BINARY`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'BLOB',\t\t\t\t\t\t\t\t\t'`BLOB`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'BOTH',\t\t\t\t\t\t\t\t\t'`BOTH`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'BY',\t\t\t\t\t\t\t\t\t'`BY`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\r\nSELECT 'CALL',\t\t\t\t\t\t\t\t\t'`CALL`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'CASCADE',\t\t\t\t\t\t\t\t'`CASCADE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'CASE',\t\t\t\t\t\t\t\t\t'`CASE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'CHANGE',\t\t\t\t\t\t\t\t'`CHANGE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'CHAR',\t\t\t\t\t\t\t\t\t'`CHAR`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'CHARACTER',\t\t\t\t\t\t\t\t'`CHARACTER`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'CHECK',\t\t\t\t\t\t\t\t\t'`CHECK`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'COLLATE',\t\t\t\t\t\t\t\t'`COLLATE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'COLUMN',\t\t\t\t\t\t\t\t'`COLUMN`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'CONDITION',\t\t\t\t\t\t\t\t'`CONDITION`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'CONSTRAINT',\t\t\t\t\t\t\t'`CONSTRAINT`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'CONTINUE',\t\t\t\t\t\t\t\t'`CONTINUE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'CONVERT',\t\t\t\t\t\t\t\t'`CONVERT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'CREATE',\t\t\t\t\t\t\t\t'`CREATE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'CROSS',\t\t\t\t\t\t\t\t\t'`CROSS`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'CURRENT_DATE',\t\t\t\t\t\t\t'`CURRENT_DATE`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'CURRENT_TIME',\t\t\t\t\t\t\t'`CURRENT_TIME`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'CURRENT_TIMESTAMP',\t\t\t\t\t\t'`CURRENT_TIMESTAMP`'\t\t\t\t\t\tUNION ALL\t\t\t\t\t\t\r\nSELECT 'CURRENT_USER',\t\t\t\t\t\t\t'`CURRENT_USER`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'CURSOR',\t\t\t\t\t\t\t\t'`CURSOR`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'DATABASE',\t\t\t\t\t\t\t\t'`DATABASE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'DATABASES',\t\t\t\t\t\t\t\t'`DATABASES`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'DAY',\t\t\t\t\t\t\t\t\t'`DAY`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'HOUR',\t\t\t\t\t\t\t\t\t'`HOUR`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'DAY_MICROSECOND',\t\t\t\t\t\t'`DAY_MICROSECOND`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\t\r\nSELECT 'DAY_MINUTE',\t\t\t\t\t\t\t'`DAY_MINUTE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'DAY_SECOND',\t\t\t\t\t\t\t'`DAY_SECOND`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'DEC',\t\t\t\t\t\t\t\t\t'`DEC`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'DECIMAL',\t\t\t\t\t\t\t\t'`DECIMAL`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'DECLARE',\t\t\t\t\t\t\t\t'`DECLARE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'DEFAULT',\t\t\t\t\t\t\t\t'`DEFAULT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'DELAYED',\t\t\t\t\t\t\t\t'`DELAYED`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'DELETE',\t\t\t\t\t\t\t\t'`DELETE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'DESC',\t\t\t\t\t\t\t\t\t'`DESC`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'DESCRIBE',\t\t\t\t\t\t\t\t'`DESCRIBE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'DETERMINISTIC',\t\t\t\t\t\t\t'`DETERMINISTIC`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'DISTINCT',\t\t\t\t\t\t\t\t'`DISTINCT`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'DISTINCTROW',\t\t\t\t\t\t\t'`DISTINCTROW`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'DIV',\t\t\t\t\t\t\t\t\t'`DIV`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'DOUBLE',\t\t\t\t\t\t\t\t'`DOUBLE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'DROP',\t\t\t\t\t\t\t\t\t'`DROP`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'DUAL',\t\t\t\t\t\t\t\t\t'`DUAL`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'EACH',\t\t\t\t\t\t\t\t\t'`EACH`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'ELSE',\t\t\t\t\t\t\t\t\t'`ELSE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'ELSEIF',\t\t\t\t\t\t\t\t'`ELSEIF`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'ENCLOSED',\t\t\t\t\t\t\t\t'`ENCLOSED`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'ESCAPED',\t\t\t\t\t\t\t\t'`ESCAPED`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'EXISTS',\t\t\t\t\t\t\t\t'`EXISTS`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'EXIT',\t\t\t\t\t\t\t\t\t'`EXIT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'EXPLAIN',\t\t\t\t\t\t\t\t'`EXPLAIN`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'FALSE',\t\t\t\t\t\t\t\t\t'`FALSE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'FETCH',\t\t\t\t\t\t\t\t\t'`FETCH`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'FLOAT',\t\t\t\t\t\t\t\t\t'`FLOAT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'FLOAT4',\t\t\t\t\t\t\t\t'`FLOAT4`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'FLOAT8',\t\t\t\t\t\t\t\t'`FLOAT8`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'FOR',\t\t\t\t\t\t\t\t\t'`FOR`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'FORCE',\t\t\t\t\t\t\t\t\t'`FORCE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'FOREIGN',\t\t\t\t\t\t\t\t'`FOREIGN`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'FROM',\t\t\t\t\t\t\t\t\t'`FROM`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'FULLTEXT',\t\t\t\t\t\t\t\t'`FULLTEXT`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'GRANT',\t\t\t\t\t\t\t\t\t'`GRANT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'GROUP',\t\t\t\t\t\t\t\t\t'`GROUP`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'HAVING',\t\t\t\t\t\t\t\t'`HAVING`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'HIGH_PRIORITY',\t\t\t\t\t\t\t'`HIGH_PRIORITY`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'HOUR_MICROSECOND',\t\t\t\t\t\t'`HOUR_MICROSECOND`'\t\t\t\t\t\tUNION ALL\t\t\t\t\t\t\r\nSELECT 'HOUR_MINUTE',\t\t\t\t\t\t\t'`HOUR_MINUTE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'HOUR_SECOND',\t\t\t\t\t\t\t'`HOUR_SECOND`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'IF',\t\t\t\t\t\t\t\t\t'`IF`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\r\nSELECT 'IGNORE',\t\t\t\t\t\t\t\t'`IGNORE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'IN',\t\t\t\t\t\t\t\t\t'`IN`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\r\nSELECT 'INDEX',\t\t\t\t\t\t\t\t\t'`INDEX`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INFILE',\t\t\t\t\t\t\t\t'`INFILE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INNER',\t\t\t\t\t\t\t\t\t'`INNER`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INOUT',\t\t\t\t\t\t\t\t\t'`INOUT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INSENSITIVE',\t\t\t\t\t\t\t'`INSENSITIVE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'INSERT',\t\t\t\t\t\t\t\t'`INSERT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INT',\t\t\t\t\t\t\t\t\t'`INT`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INT1',\t\t\t\t\t\t\t\t\t'`INT1`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INT2',\t\t\t\t\t\t\t\t\t'`INT2`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INT3',\t\t\t\t\t\t\t\t\t'`INT3`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INT4',\t\t\t\t\t\t\t\t\t'`INT4`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INT8',\t\t\t\t\t\t\t\t\t'`INT8`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'INTEGER',\t\t\t\t\t\t\t\t'`INTEGER`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'INTERVAL',\t\t\t\t\t\t\t\t'`INTERVAL`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'INTO',\t\t\t\t\t\t\t\t\t'`INTO`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'IS',\t\t\t\t\t\t\t\t\t'`IS`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\r\nSELECT 'ITERATE',\t\t\t\t\t\t\t\t'`ITERATE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'JOIN',\t\t\t\t\t\t\t\t\t'`JOIN`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'KEY',\t\t\t\t\t\t\t\t\t'`KEY`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'KEYS',\t\t\t\t\t\t\t\t\t'`KEYS`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'KILL',\t\t\t\t\t\t\t\t\t'`KILL`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LEADING',\t\t\t\t\t\t\t\t'`LEADING`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'LEAVE',\t\t\t\t\t\t\t\t\t'`LEAVE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LEFT',\t\t\t\t\t\t\t\t\t'`LEFT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LIKE',\t\t\t\t\t\t\t\t\t'`LIKE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LIMIT',\t\t\t\t\t\t\t\t\t'`LIMIT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LINEAR',\t\t\t\t\t\t\t\t'`LINEAR`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LINES',\t\t\t\t\t\t\t\t\t'`LINES`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LOAD',\t\t\t\t\t\t\t\t\t'`LOAD`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LOCALTIME',\t\t\t\t\t\t\t\t'`LOCALTIME`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'LOCALTIMESTAMP',\t\t\t\t\t\t'`LOCALTIMESTAMP`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'LOCK',\t\t\t\t\t\t\t\t\t'`LOCK`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LONG',\t\t\t\t\t\t\t\t\t'`LONG`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LONGBLOB',\t\t\t\t\t\t\t\t'`LONGBLOB`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'LONGTEXT',\t\t\t\t\t\t\t\t'`LONGTEXT`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'LOOP',\t\t\t\t\t\t\t\t\t'`LOOP`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'LOW_PRIORITY',\t\t\t\t\t\t\t'`LOW_PRIORITY`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'MASTER_SSL_VERIFY_SERVER_CERT',\t\t\t'`MASTER_SSL_VERIFY_SERVER_CERT`'\t\t\tUNION ALL\t\t\t\t\t\t\t\r\nSELECT 'MATCH',\t\t\t\t\t\t\t\t\t'`MATCH`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'MAXVALUE',\t\t\t\t\t\t\t\t'`MAXVALUE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'MEDIUMBLOB',\t\t\t\t\t\t\t'`MEDIUMBLOB`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'MEDIUMINT',\t\t\t\t\t\t\t\t'`MEDIUMINT`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'MEDIUMTEXT',\t\t\t\t\t\t\t'`MEDIUMTEXT`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'MIDDLEINT',\t\t\t\t\t\t\t\t'`MIDDLEINT`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'MINUTE_MICROSECOND',\t\t\t\t\t'`MINUTE_MICROSECOND`'\t\t\t\t\t\tUNION ALL\t\t\t\t\t\t\r\nSELECT 'MINUTE_SECOND',\t\t\t\t\t\t\t'`MINUTE_SECOND`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'MOD',\t\t\t\t\t\t\t\t\t'`MOD`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'MODIFIES',\t\t\t\t\t\t\t\t'`MODIFIES`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'NATURAL',\t\t\t\t\t\t\t\t'`NATURAL`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'NOT',\t\t\t\t\t\t\t\t\t'`NOT`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'NO_WRITE_TO_BINLOG',\t\t\t\t\t'`NO_WRITE_TO_BINLOG`'\t\t\t\t\t\tUNION ALL\t\t\t\t\t\t\r\nSELECT 'NULL',\t\t\t\t\t\t\t\t\t'`NULL`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'NUMERIC',\t\t\t\t\t\t\t\t'`NUMERIC`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'ON',\t\t\t\t\t\t\t\t\t'`ON`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\r\nSELECT 'OPTIMIZE',\t\t\t\t\t\t\t\t'`OPTIMIZE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'OPTION',\t\t\t\t\t\t\t\t'`OPTION`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'OPTIONALLY',\t\t\t\t\t\t\t'`OPTIONALLY`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'OR',\t\t\t\t\t\t\t\t\t'`OR`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\r\nSELECT 'ORDER',\t\t\t\t\t\t\t\t\t'`ORDER`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'OUT',\t\t\t\t\t\t\t\t\t'`OUT`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'OUTER',\t\t\t\t\t\t\t\t\t'`OUTER`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'OUTFILE',\t\t\t\t\t\t\t\t'`OUTFILE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'PRECISION',\t\t\t\t\t\t\t\t'`PRECISION`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'PRIMARY',\t\t\t\t\t\t\t\t'`PRIMARY`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'PROCEDURE',\t\t\t\t\t\t\t\t'`PROCEDURE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'PURGE',\t\t\t\t\t\t\t\t\t'`PURGE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'RANGE',\t\t\t\t\t\t\t\t\t'`RANGE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'READ',\t\t\t\t\t\t\t\t\t'`READ`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'READS',\t\t\t\t\t\t\t\t\t'`READS`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'READ_WRITE',\t\t\t\t\t\t\t'`READ_WRITE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'REAL',\t\t\t\t\t\t\t\t\t'`REAL`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'REFERENCES',\t\t\t\t\t\t\t'`REFERENCES`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'REGEXP',\t\t\t\t\t\t\t\t'`REGEXP`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'RELEASE',\t\t\t\t\t\t\t\t'`RELEASE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'RENAME',\t\t\t\t\t\t\t\t'`RENAME`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'REPEAT',\t\t\t\t\t\t\t\t'`REPEAT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'REPLACE',\t\t\t\t\t\t\t\t'`REPLACE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'REQUIRE',\t\t\t\t\t\t\t\t'`REQUIRE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'RESIGNAL',\t\t\t\t\t\t\t\t'`RESIGNAL`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'RESTRICT',\t\t\t\t\t\t\t\t'`RESTRICT`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'RETURN',\t\t\t\t\t\t\t\t'`RETURN`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'REVOKE',\t\t\t\t\t\t\t\t'`REVOKE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'RIGHT',\t\t\t\t\t\t\t\t\t'`RIGHT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'RLIKE',\t\t\t\t\t\t\t\t\t'`RLIKE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'SCHEMA',\t\t\t\t\t\t\t\t'`SCHEMA`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'SCHEMAS',\t\t\t\t\t\t\t\t'`SCHEMAS`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'SECOND_MICROSECOND',\t\t\t\t\t'`SECOND_MICROSECOND`'\t\t\t\t\t\tUNION ALL\t\t\t\t\t\t\r\nSELECT 'SELECT',\t\t\t\t\t\t\t\t'`SELECT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'SENSITIVE',\t\t\t\t\t\t\t\t'`SENSITIVE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'SEPARATOR',\t\t\t\t\t\t\t\t'`SEPARATOR`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'SET',\t\t\t\t\t\t\t\t\t'`SET`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'SHOW',\t\t\t\t\t\t\t\t\t'`SHOW`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'SIGNAL',\t\t\t\t\t\t\t\t'`SIGNAL`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'SMALLINT',\t\t\t\t\t\t\t\t'`SMALLINT`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'SPATIAL',\t\t\t\t\t\t\t\t'`SPATIAL`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'SPECIFIC',\t\t\t\t\t\t\t\t'`SPECIFIC`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'SQL',\t\t\t\t\t\t\t\t\t'`SQL`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'SQLEXCEPTION',\t\t\t\t\t\t\t'`SQLEXCEPTION`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'SQLSTATE',\t\t\t\t\t\t\t\t'`SQLSTATE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'SQLWARNING',\t\t\t\t\t\t\t'`SQLWARNING`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'SQL_BIG_RESULT',\t\t\t\t\t\t'`SQL_BIG_RESULT`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'SQL_CALC_FOUND_ROWS',\t\t\t\t\t'`SQL_CALC_FOUND_ROWS`'\t\t\t\t\t\tUNION ALL\t\t\t\t\t\t\t\r\nSELECT 'SQL_SMALL_RESULT',\t\t\t\t\t\t'`SQL_SMALL_RESULT`'\t\t\t\t\t\tUNION ALL\t\t\t\t\t\t\r\nSELECT 'SSL',\t\t\t\t\t\t\t\t\t'`SSL`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'STARTING',\t\t\t\t\t\t\t\t'`STARTING`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'STRAIGHT_JOIN',\t\t\t\t\t\t\t'`STRAIGHT_JOIN`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'TABLE',\t\t\t\t\t\t\t\t\t'`TABLE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'TERMINATED',\t\t\t\t\t\t\t'`TERMINATED`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'THEN',\t\t\t\t\t\t\t\t\t'`THEN`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'TINYBLOB',\t\t\t\t\t\t\t\t'`TINYBLOB`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'TINYINT',\t\t\t\t\t\t\t\t'`TINYINT`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'TINYTEXT',\t\t\t\t\t\t\t\t'`TINYTEXT`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'TO',\t\t\t\t\t\t\t\t\t'`TO`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\r\nSELECT 'TRAILING',\t\t\t\t\t\t\t\t'`TRAILING`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'TRIGGER',\t\t\t\t\t\t\t\t'`TRIGGER`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'TRUE',\t\t\t\t\t\t\t\t\t'`TRUE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'UNDO',\t\t\t\t\t\t\t\t\t'`UNDO`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'UNION',\t\t\t\t\t\t\t\t\t'`UNION`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'UNIQUE',\t\t\t\t\t\t\t\t'`UNIQUE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'UNLOCK',\t\t\t\t\t\t\t\t'`UNLOCK`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'UNSIGNED',\t\t\t\t\t\t\t\t'`UNSIGNED`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'UPDATE',\t\t\t\t\t\t\t\t'`UPDATE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'USAGE',\t\t\t\t\t\t\t\t\t'`USAGE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'USE',\t\t\t\t\t\t\t\t\t'`USE`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'USING',\t\t\t\t\t\t\t\t\t'`USING`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'UTC_DATE',\t\t\t\t\t\t\t\t'`UTC_DATE`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'UTC_TIME',\t\t\t\t\t\t\t\t'`UTC_TIME`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'UTC_TIMESTAMP',\t\t\t\t\t\t\t'`UTC_TIMESTAMP`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'VALUES',\t\t\t\t\t\t\t\t'`VALUES`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'VARBINARY',\t\t\t\t\t\t\t\t'`VARBINARY`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'VARCHAR',\t\t\t\t\t\t\t\t'`VARCHAR`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'VARCHARACTER',\t\t\t\t\t\t\t'`VARCHARACTER`'\t\t\t\t\t\t\tUNION ALL\t\t\t\t\t\r\nSELECT 'VARYING',\t\t\t\t\t\t\t\t'`VARYING`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'WHEN',\t\t\t\t\t\t\t\t\t'`WHEN`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'WHERE',\t\t\t\t\t\t\t\t\t'`WHERE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'WHILE',\t\t\t\t\t\t\t\t\t'`WHILE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'WITH',\t\t\t\t\t\t\t\t\t'`WITH`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'WRITE',\t\t\t\t\t\t\t\t\t'`WRITE`'\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'XOR',\t\t\t\t\t\t\t\t\t'`XOR`'\t\t\t\t\t\t\t\t\t\tUNION ALL\t\t\t\r\nSELECT 'YEAR_MONTH',\t\t\t\t\t\t\t'`YEAR_MONTH`'\t\t\t\t\t\t\t\tUNION ALL\t\t\t\t\r\nSELECT 'ZEROFILL',\t\t\t\t\t\t\t\t'`ZEROFILL`'\t\t\t\t\t\t\t\t\r\nGO\r\n\r\n\r\n\r\nCREATE VIEW &#x5B;dbo].&#x5B;vw_MssqlReservedWords] AS\r\nSELECT \t'ADD' AS reserved_word,\t\t\t\t\t'&#x5B;ADD]' AS mssql_version\t\t\tUNION ALL\r\nSELECT \t'EXTERNAL',\t\t\t\t\t\t\t\t'&#x5B;EXTERNAL]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'PROCEDURE',\t\t\t\t\t\t\t'&#x5B;PROCEDURE]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ALL',\t\t\t\t\t\t\t\t\t'&#x5B;ALL]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'FETCH',\t\t\t\t\t\t\t\t'&#x5B;FETCH]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'PUBLIC',\t\t\t\t\t\t\t\t'&#x5B;PUBLIC]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ALTER',\t\t\t\t\t\t\t\t'&#x5B;ALTER]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'FILE',\t\t\t\t\t\t\t\t\t'&#x5B;FILE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'RAISERROR',\t\t\t\t\t\t\t'&#x5B;RAISERROR]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'AND',\t\t\t\t\t\t\t\t\t'&#x5B;AND]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'FILLFACTOR',\t\t\t\t\t\t\t'&#x5B;FILLFACTOR]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'READ',\t\t\t\t\t\t\t\t\t'&#x5B;READ]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ANY',\t\t\t\t\t\t\t\t\t'&#x5B;ANY]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'FOR',\t\t\t\t\t\t\t\t\t'&#x5B;FOR]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'READTEXT',\t\t\t\t\t\t\t\t'&#x5B;READTEXT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'AS',\t\t\t\t\t\t\t\t\t'&#x5B;AS]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'FOREIGN',\t\t\t\t\t\t\t\t'&#x5B;FOREIGN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'RECONFIGURE',\t\t\t\t\t\t\t'&#x5B;RECONFIGURE]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ASC',\t\t\t\t\t\t\t\t\t'&#x5B;ASC]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'FREETEXT',\t\t\t\t\t\t\t\t'&#x5B;FREETEXT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'REFERENCES',\t\t\t\t\t\t\t'&#x5B;REFERENCES]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'AUTHORIZATION',\t\t\t\t\t\t'&#x5B;AUTHORIZATION]'\t\t\t\t\tUNION ALL\r\nSELECT \t'FREETEXTTABLE',\t\t\t\t\t\t'&#x5B;FREETEXTTABLE]'\t\t\t\t\tUNION ALL\r\nSELECT \t'REPLICATION',\t\t\t\t\t\t\t'&#x5B;REPLICATION]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'BACKUP',\t\t\t\t\t\t\t\t'&#x5B;BACKUP]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'FROM',\t\t\t\t\t\t\t\t\t'&#x5B;FROM]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'RESTORE',\t\t\t\t\t\t\t\t'&#x5B;RESTORE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'BEGIN',\t\t\t\t\t\t\t\t'&#x5B;BEGIN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'FULL',\t\t\t\t\t\t\t\t\t'&#x5B;FULL]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'RESTRICT',\t\t\t\t\t\t\t\t'&#x5B;RESTRICT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'BETWEEN',\t\t\t\t\t\t\t\t'&#x5B;BETWEEN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'FUNCTION',\t\t\t\t\t\t\t\t'&#x5B;FUNCTION]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'RETURN',\t\t\t\t\t\t\t\t'&#x5B;RETURN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'BREAK',\t\t\t\t\t\t\t\t'&#x5B;BREAK]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'GOTO',\t\t\t\t\t\t\t\t\t'&#x5B;GOTO]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'REVERT',\t\t\t\t\t\t\t\t'&#x5B;REVERT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'BROWSE',\t\t\t\t\t\t\t\t'&#x5B;BROWSE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'GRANT',\t\t\t\t\t\t\t\t'&#x5B;GRANT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'REVOKE',\t\t\t\t\t\t\t\t'&#x5B;REVOKE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'BULK',\t\t\t\t\t\t\t\t\t'&#x5B;BULK]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'GROUP',\t\t\t\t\t\t\t\t'&#x5B;GROUP]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'RIGHT',\t\t\t\t\t\t\t\t'&#x5B;RIGHT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'BY',\t\t\t\t\t\t\t\t\t'&#x5B;BY]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'HAVING',\t\t\t\t\t\t\t\t'&#x5B;HAVING]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ROLLBACK',\t\t\t\t\t\t\t\t'&#x5B;ROLLBACK]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CASCADE',\t\t\t\t\t\t\t\t'&#x5B;CASCADE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'HOLDLOCK',\t\t\t\t\t\t\t\t'&#x5B;HOLDLOCK]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ROWCOUNT',\t\t\t\t\t\t\t\t'&#x5B;ROWCOUNT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CASE',\t\t\t\t\t\t\t\t\t'&#x5B;CASE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'IDENTITY',\t\t\t\t\t\t\t\t'&#x5B;IDENTITY]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ROWGUIDCOL',\t\t\t\t\t\t\t'&#x5B;ROWGUIDCOL]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CHECK',\t\t\t\t\t\t\t\t'&#x5B;CHECK]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'IDENTITY_INSERT',\t\t\t\t\t\t'&#x5B;IDENTITY_INSERT]'\t\t\t\t\tUNION ALL\r\nSELECT \t'RULE',\t\t\t\t\t\t\t\t\t'&#x5B;RULE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CHECKPOINT',\t\t\t\t\t\t\t'&#x5B;CHECKPOINT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'IDENTITYCOL',\t\t\t\t\t\t\t'&#x5B;IDENTITYCOL]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SAVE',\t\t\t\t\t\t\t\t\t'&#x5B;SAVE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CLOSE',\t\t\t\t\t\t\t\t'&#x5B;CLOSE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'IF',\t\t\t\t\t\t\t\t\t'&#x5B;IF]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SCHEMA',\t\t\t\t\t\t\t\t'&#x5B;SCHEMA]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CLUSTERED',\t\t\t\t\t\t\t'&#x5B;CLUSTERED]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'IN',\t\t\t\t\t\t\t\t\t'&#x5B;IN]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SECURITYAUDIT',\t\t\t\t\t\t'&#x5B;SECURITYAUDIT]'\t\t\t\t\tUNION ALL\r\nSELECT \t'COALESCE',\t\t\t\t\t\t\t\t'&#x5B;COALESCE]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'INDEX',\t\t\t\t\t\t\t\t'&#x5B;INDEX]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SELECT',\t\t\t\t\t\t\t\t'&#x5B;SELECT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'COLLATE',\t\t\t\t\t\t\t\t'&#x5B;COLLATE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'INNER',\t\t\t\t\t\t\t\t'&#x5B;INNER]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SEMANTICKEYPHRASETABLE',\t\t\t\t'&#x5B;SEMANTICKEYPHRASETABLE]'\t\t\tUNION ALL\r\nSELECT \t'COLUMN',\t\t\t\t\t\t\t\t'&#x5B;COLUMN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'INSERT',\t\t\t\t\t\t\t\t'&#x5B;INSERT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SEMANTICSIMILARITYDETAILSTABLE',\t\t'&#x5B;SEMANTICSIMILARITYDETAILSTABLE]'\tUNION ALL\r\nSELECT \t'COMMIT',\t\t\t\t\t\t\t\t'&#x5B;COMMIT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'INTERSECT',\t\t\t\t\t\t\t'&#x5B;INTERSECT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SEMANTICSIMILARITYTABLE',\t\t\t\t'&#x5B;SEMANTICSIMILARITYTABLE]'\t\t\tUNION ALL\r\nSELECT \t'COMPUTE',\t\t\t\t\t\t\t\t'&#x5B;COMPUTE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'INTO',\t\t\t\t\t\t\t\t\t'&#x5B;INTO]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SESSION_USER',\t\t\t\t\t\t\t'&#x5B;SESSION_USER]'\t\t\t\t\tUNION ALL\r\nSELECT \t'CONSTRAINT',\t\t\t\t\t\t\t'&#x5B;CONSTRAINT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'IS',\t\t\t\t\t\t\t\t\t'&#x5B;IS]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SET',\t\t\t\t\t\t\t\t\t'&#x5B;SET]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CONTAINS',\t\t\t\t\t\t\t\t'&#x5B;CONTAINS]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'JOIN',\t\t\t\t\t\t\t\t\t'&#x5B;JOIN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SETUSER',\t\t\t\t\t\t\t\t'&#x5B;SETUSER]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CONTAINSTABLE',\t\t\t\t\t\t'&#x5B;CONTAINSTABLE]'\t\t\t\t\tUNION ALL\r\nSELECT \t'KEY',\t\t\t\t\t\t\t\t\t'&#x5B;KEY]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SHUTDOWN',\t\t\t\t\t\t\t\t'&#x5B;SHUTDOWN]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CONTINUE',\t\t\t\t\t\t\t\t'&#x5B;CONTINUE]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'KILL',\t\t\t\t\t\t\t\t\t'&#x5B;KILL]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SOME',\t\t\t\t\t\t\t\t\t'&#x5B;SOME]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CONVERT',\t\t\t\t\t\t\t\t'&#x5B;CONVERT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'LEFT',\t\t\t\t\t\t\t\t\t'&#x5B;LEFT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'STATISTICS',\t\t\t\t\t\t\t'&#x5B;STATISTICS]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CREATE',\t\t\t\t\t\t\t\t'&#x5B;CREATE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'LIKE',\t\t\t\t\t\t\t\t\t'&#x5B;LIKE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SYSTEM_USER',\t\t\t\t\t\t\t'&#x5B;SYSTEM_USER]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CROSS',\t\t\t\t\t\t\t\t'&#x5B;CROSS]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'LINENO',\t\t\t\t\t\t\t\t'&#x5B;LINENO]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'TABLE',\t\t\t\t\t\t\t\t'&#x5B;TABLE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CURRENT',\t\t\t\t\t\t\t\t'&#x5B;CURRENT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'LOAD',\t\t\t\t\t\t\t\t\t'&#x5B;LOAD]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'TABLESAMPLE',\t\t\t\t\t\t\t'&#x5B;TABLESAMPLE]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CURRENT_DATE',\t\t\t\t\t\t\t'&#x5B;CURRENT_DATE]'\t\t\t\t\tUNION ALL\r\nSELECT \t'MERGE',\t\t\t\t\t\t\t\t'&#x5B;MERGE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'TEXTSIZE',\t\t\t\t\t\t\t\t'&#x5B;TEXTSIZE]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CURRENT_TIME',\t\t\t\t\t\t\t'&#x5B;CURRENT_TIME]'\t\t\t\t\tUNION ALL\r\nSELECT \t'NATIONAL',\t\t\t\t\t\t\t\t'&#x5B;NATIONAL]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'THEN',\t\t\t\t\t\t\t\t\t'&#x5B;THEN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CURRENT_TIMESTAMP',\t\t\t\t\t'&#x5B;CURRENT_TIMESTAMP]'\t\t\t\tUNION ALL\r\nSELECT \t'NOCHECK',\t\t\t\t\t\t\t\t'&#x5B;NOCHECK]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'TO',\t\t\t\t\t\t\t\t\t'&#x5B;TO]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CURRENT_USER',\t\t\t\t\t\t\t'&#x5B;CURRENT_USER]'\t\t\t\t\tUNION ALL\r\nSELECT \t'NONCLUSTERED',\t\t\t\t\t\t\t'&#x5B;NONCLUSTERED]'\t\t\t\t\tUNION ALL\r\nSELECT \t'TOP',\t\t\t\t\t\t\t\t\t'&#x5B;TOP]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'CURSOR',\t\t\t\t\t\t\t\t'&#x5B;CURSOR]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'NOT',\t\t\t\t\t\t\t\t\t'&#x5B;NOT]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'TRAN',\t\t\t\t\t\t\t\t\t'&#x5B;TRAN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DATABASE',\t\t\t\t\t\t\t\t'&#x5B;DATABASE]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'NULL',\t\t\t\t\t\t\t\t\t'&#x5B;NULL]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'TRANSACTION',\t\t\t\t\t\t\t'&#x5B;TRANSACTION]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DBCC',\t\t\t\t\t\t\t\t\t'&#x5B;DBCC]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'NULLIF',\t\t\t\t\t\t\t\t'&#x5B;NULLIF]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'TRIGGER',\t\t\t\t\t\t\t\t'&#x5B;TRIGGER]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DEALLOCATE',\t\t\t\t\t\t\t'&#x5B;DEALLOCATE]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OF',\t\t\t\t\t\t\t\t\t'&#x5B;OF]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'TRUNCATE',\t\t\t\t\t\t\t\t'&#x5B;TRUNCATE]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DECLARE',\t\t\t\t\t\t\t\t'&#x5B;DECLARE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OFF',\t\t\t\t\t\t\t\t\t'&#x5B;OFF]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'TRY_CONVERT',\t\t\t\t\t\t\t'&#x5B;TRY_CONVERT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DEFAULT',\t\t\t\t\t\t\t\t'&#x5B;DEFAULT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OFFSETS',\t\t\t\t\t\t\t\t'&#x5B;OFFSETS]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'TSEQUAL',\t\t\t\t\t\t\t\t'&#x5B;TSEQUAL]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DELETE',\t\t\t\t\t\t\t\t'&#x5B;DELETE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ON',\t\t\t\t\t\t\t\t\t'&#x5B;ON]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'UNION',\t\t\t\t\t\t\t\t'&#x5B;UNION]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DENY',\t\t\t\t\t\t\t\t\t'&#x5B;DENY]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OPEN',\t\t\t\t\t\t\t\t\t'&#x5B;OPEN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'UNIQUE',\t\t\t\t\t\t\t\t'&#x5B;UNIQUE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DESC',\t\t\t\t\t\t\t\t\t'&#x5B;DESC]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OPENDATASOURCE',\t\t\t\t\t\t'&#x5B;OPENDATASOURCE]'\t\t\t\t\tUNION ALL\r\nSELECT \t'UNPIVOT',\t\t\t\t\t\t\t\t'&#x5B;UNPIVOT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DISK',\t\t\t\t\t\t\t\t\t'&#x5B;DISK]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OPENQUERY',\t\t\t\t\t\t\t'&#x5B;OPENQUERY]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'UPDATE',\t\t\t\t\t\t\t\t'&#x5B;UPDATE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DISTINCT',\t\t\t\t\t\t\t\t'&#x5B;DISTINCT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OPENROWSET',\t\t\t\t\t\t\t'&#x5B;OPENROWSET]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'UPDATETEXT',\t\t\t\t\t\t\t'&#x5B;UPDATETEXT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DISTRIBUTED',\t\t\t\t\t\t\t'&#x5B;DISTRIBUTED]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OPENXML',\t\t\t\t\t\t\t\t'&#x5B;OPENXML]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'USE',\t\t\t\t\t\t\t\t\t'&#x5B;USE]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DOUBLE',\t\t\t\t\t\t\t\t'&#x5B;DOUBLE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OPTION',\t\t\t\t\t\t\t\t'&#x5B;OPTION]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'USER',\t\t\t\t\t\t\t\t\t'&#x5B;USER]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DROP',\t\t\t\t\t\t\t\t\t'&#x5B;DROP]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OR',\t\t\t\t\t\t\t\t\t'&#x5B;OR]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'VALUES',\t\t\t\t\t\t\t\t'&#x5B;VALUES]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'DUMP',\t\t\t\t\t\t\t\t\t'&#x5B;DUMP]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ORDER',\t\t\t\t\t\t\t\t'&#x5B;ORDER]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'VARYING',\t\t\t\t\t\t\t\t'&#x5B;VARYING]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ELSE',\t\t\t\t\t\t\t\t\t'&#x5B;ELSE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OUTER',\t\t\t\t\t\t\t\t'&#x5B;OUTER]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'VIEW',\t\t\t\t\t\t\t\t\t'&#x5B;VIEW]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'END',\t\t\t\t\t\t\t\t\t'&#x5B;END]'\t\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'OVER',\t\t\t\t\t\t\t\t\t'&#x5B;OVER]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'WAITFOR',\t\t\t\t\t\t\t\t'&#x5B;WAITFOR]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ERRLVL',\t\t\t\t\t\t\t\t'&#x5B;ERRLVL]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'PERCENT',\t\t\t\t\t\t\t\t'&#x5B;PERCENT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'WHEN',\t\t\t\t\t\t\t\t\t'&#x5B;WHEN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'ESCAPE',\t\t\t\t\t\t\t\t'&#x5B;ESCAPE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'PIVOT',\t\t\t\t\t\t\t\t'&#x5B;PIVOT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'WHERE',\t\t\t\t\t\t\t\t'&#x5B;WHERE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'EXCEPT',\t\t\t\t\t\t\t\t'&#x5B;EXCEPT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'PLAN',\t\t\t\t\t\t\t\t\t'&#x5B;PLAN]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'WHILE',\t\t\t\t\t\t\t\t'&#x5B;WHILE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'EXEC',\t\t\t\t\t\t\t\t\t'&#x5B;EXEC]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'PRECISION',\t\t\t\t\t\t\t'&#x5B;PRECISION]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'WITH',\t\t\t\t\t\t\t\t\t'&#x5B;WITH]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'EXECUTE',\t\t\t\t\t\t\t\t'&#x5B;EXECUTE]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'PRIMARY',\t\t\t\t\t\t\t\t'&#x5B;PRIMARY]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'WITHIN GROUP',\t\t\t\t\t\t\t'&#x5B;WITHIN GROUP]'\t\t\t\t\tUNION ALL\r\nSELECT \t'EXISTS',\t\t\t\t\t\t\t\t'&#x5B;EXISTS]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'PRINT',\t\t\t\t\t\t\t\t'&#x5B;PRINT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'WRITETEXT',\t\t\t\t\t\t\t'&#x5B;WRITETEXT]'\t\t\t\t\t\tUNION ALL\r\nSELECT \t'EXIT',\t\t\t\t\t\t\t\t\t'&#x5B;EXIT]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'PROC',\t\t\t\t\t\t\t\t\t'&#x5B;PROC]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'USER_ID',\t\t\t\t\t\t\t\t'&#x5B;USER_ID]'\t\t\t\t\t\t\tUNION ALL\r\nSELECT \t'SEQUENCE',\t\t\t\t\t\t\t\t'&#x5B;SEQUENCE]'\r\nGO\r\n<\/pre>\n<p style=\"text-align: justify;\">These tables\/views, as mentioned before, will be referenced in subsequent posts and code as they provide the process with relevant metadata information to control tables, tables\u2019 attributes, indexes, error notification alerts etc. and in case any change is required, provide a central point of reference for implementation. Also, all entries made into the four tables above correspond to my development environment so if replicating this functionality is your goal I suggest adjusting data entered\/used in this post to one that matches your environment.<\/p>\n<p style=\"text-align: justify;\">As part of this preliminary set up we will also create AdminDBA database (named this way, instead of ErrorsDB, only because it is probably too much hassle to change the already well documented code in one of my previous post). This database will be used to log any execution errors which can determine further package work flow e.g. determine if the subsequent task should or shouldn&#8217;t execute. A stored procedure responsible for sending out notification errors will also be located here as will a function concatenating e-mail addresses used by the package.<\/p>\n<p style=\"text-align: justify;\">I have written extensively on how error capture and logging works in this process in my two previous blog posts (<a href=\"http:\/\/bicortex.com\/how-to-create-a-simple-etlstored-procedure-error-capturing-database-schema-model-sql-code-and-implementation-part-1\/\" target=\"_blank\">HERE<\/a> and <a href=\"http:\/\/bicortex.com\/how-to-create-a-simple-etlstored-procedure-error-capturing-database-schema-model-sql-code-and-implementation-part-2\/\" target=\"_blank\">HERE<\/a>) so I won\u2019t be repeating myself in this post. For full details on the schema and the actual code used to create this database please view my previous blog posts <a href=\"http:\/\/bicortex.com\/how-to-create-a-simple-etlstored-procedure-error-capturing-database-schema-model-sql-code-and-implementation-part-1\/\" target=\"_blank\">HERE<\/a> and <a href=\"http:\/\/bicortex.com\/how-to-create-a-simple-etlstored-procedure-error-capturing-database-schema-model-sql-code-and-implementation-part-2\/\" target=\"_blank\">HERE<\/a>.<\/p>\n<p style=\"text-align: justify;\">Once all the databases and their\u00a0objects have been\u00a0created successfully, the below stored procedure,\u00a0allowing sending out notifications on any errors that occurred during package runtime (highlighted line entry needs to be modified with a valid reporting platform URL pointing to the AdminDBA database log report) as well as a scalar function, allowing\u00a0tabular e-mail address entries\u00a0conversion into a comma separated array, can be created. These two objects will later be incorporated into the SSIS package to manage error notifications distribution via e-mail.<\/p>\n<pre class=\"brush: sql; highlight: [104]; title: ; notranslate\" title=\"\">\r\n\/*====================================================================================\r\nSTEP 1\r\nCreate 'error distribution' stored procedure to manage error notifications based\r\non executing stored procedure name and reporting platform in use (see the highlighted\r\nline). When implementing, please replace 'https:\/\/YourReportingPlatform' with\r\na valid URL pointing to the reporting platform e.g. SSRS, Tableau etc. where \r\na detained report based on AdminDBA database logs can be accessed from. \r\n====================================================================================*\/\r\nUSE &#x5B;AdminDBA]\r\nGO\r\n\r\nSET ANSI_NULLS ON\r\nGO\r\n\r\nSET QUOTED_IDENTIFIER ON\r\nGO\r\n\r\nCREATE PROCEDURE &#x5B;dbo].&#x5B;usp_sendBIGroupETLFailMessage]\r\n    (\r\n      @Execution_Instance_GUID UNIQUEIDENTIFIER ,\r\n      @Package_Start_DateTime DATETIME ,\r\n      @Error_Message NVARCHAR(MAX) ,\r\n      @DBMail_Profile_Name VARCHAR(100) ,\r\n      @DBMail_Recipients VARCHAR(1024) ,\r\n      @DBMail_Msg_Body_Format VARCHAR(20) ,\r\n      @DBMail_Msg_Subject NVARCHAR(255) ,\r\n      @DBMail_Msg_Importance VARCHAR(6) ,\r\n      @Package_Name NVARCHAR(255) ,\r\n      @Process_Name NVARCHAR(255) ,\r\n      @Object_Name NVARCHAR(255)\r\n    )\r\nAS\r\n    BEGIN\r\n        IF OBJECT_ID('tempdb..#Temp') IS NOT NULL\r\n            BEGIN\r\n                DROP TABLE #Temp\r\n            END\t\r\n\t\t\r\n        SELECT  \r\n\t\tCOALESCE(@Package_Name,'Unknown')\t\t\t\t\t\t\t\t\t\t\tAS PackageName,\r\n\t\tCOALESCE(CAST(DB_NAME() AS VARCHAR (128)) , 'Unknown')\t\t\t\t\t\tAS DatabaseName,\r\n\t\tCOALESCE(CAST(@Execution_Instance_GUID AS VARCHAR (60)) , 'Unknown')\t\tAS ExecutionInstanceGUID,\r\n\t\tCOALESCE(CONVERT(VARCHAR (50),@Package_Start_DateTime, 120) , 'Unknown')\tAS PackageStartDateTime,\r\n\t\tCOALESCE(CONVERT(VARCHAR (50),SYSDATETIME(), 120), 'Unknown')\t\t\t\tAS EventDateTime,\r\n\t\tCOALESCE(@Object_Name,'Unknown')\t\t\t\t\t\t\t\t\t\t\tAS ObjectName,\r\n\t\tCOALESCE(@Process_Name, 'Unknown')\t\t\t\t\t\t\t\t\t\t\tAS ErrorProcedure,\r\n\t\tCOALESCE(@Error_Message , 'Unknown')\t\t\t\t\t\t\t\t\t\tAS ErrorMessage\r\n\t\tINTO #Temp\r\n\r\n\t\tUPDATE #Temp\r\n\t\tSET ObjectName = 'Unknown'\r\n\t\tWHERE ObjectName = ''\r\n \r\n        IF OBJECT_ID('tempdb..#Msg') IS NOT NULL\r\n            BEGIN\r\n                DROP TABLE &#x5B;#Msg]\r\n            END\r\n\r\n        CREATE TABLE #Msg\r\n            (\r\n              &#x5B;ID] &#x5B;INT] IDENTITY(1, 1) NOT NULL ,\r\n              &#x5B;ProcessName] &#x5B;VARCHAR](255) NULL ,\r\n              &#x5B;MsgText] VARCHAR(1024) NULL ,\r\n            );      \r\n\r\n        INSERT  INTO #Msg\r\n                ( &#x5B;ProcessName] ,\r\n                  &#x5B;MsgText] \t                  \r\n                )\r\n                SELECT  'usp_updateLogSSISErrorsDBObjects' AS ProcessName ,\r\n                        ''+@@SERVERNAME+''+' instance metadata update process for package ' + ''+@Package_Name+''+' has encountered an error during processing' AS MsgText\r\n                UNION ALL\r\n\t\t\t\tSELECT\t'usp_checkRemoteSvrMySQLTablesSchemaChanges',\r\n\t\t\t\t\t\t'Table schema definition reconciliation failed between '+''+@@SERVERNAME+''+'and the remote server for package ' + ''+@Package_Name+''+''\r\n\t\t\t\tUNION ALL\r\n                SELECT  'usp_checkRemoteSvrConnectionStatus' ,\r\n                        'Connection from ' +''+@@SERVERNAME+''+ ' to a remote\/linked server cannot be established at this time for package ' + ''+@Package_Name+''+''\r\n                UNION ALL\r\n                SELECT  'usp_checkRemoteSvrDBvsLocalDBRecCounts' ,\r\n                        'Preliminary record count between a remote\/linked server and staging database on ' +''+@@SERVERNAME+''+' server is different'\r\n\t\t\t\tUNION ALL\r\n\t\t\t\tSELECT\t'usp_runCreateDropStagingIDXs',\r\n\t\t\t\t\t\t'Creating\/dropping staging environment indexes procedure for package ' + ''+@Package_Name+''+' raised errors during execution on ' +''+@@SERVERNAME+''+ ' server'\r\n\t\t\t\tUNION ALL\r\n                SELECT  'Non-specyfic SSIS Job Transformation Failure' ,\r\n                        'SSIS package ' + ''+@Package_Name+''+' failed during execution on ' +''+@@SERVERNAME+''+ ' server'\t\t\t\t\t\t\t\t\r\n\t\t\t\tUNION ALL\r\n\t\t\t\tSELECT 'usp_checkRemoteSvrDBvsLocalDBSyncErrors',\r\n\t\t\t\t\t\t'SSIS package ' + ''+@Package_Name+''+' finished executing; however, some errors were raised at runtime on ' +''+@@SERVERNAME+''+ ' server'\r\n\t\t\t\tUNION ALL\r\n\t\t\t\tSELECT 'usp_runUpdateStagingDBStatistics',\r\n\t\t\t\t\t\t'Statistics update step in ' + ''+@Package_Name+''+' package failed during execution on ' +''+@@SERVERNAME+''+ ' server'\r\n\r\n\r\n        DECLARE @Heading NVARCHAR(1024) = ( SELECT  MsgText\r\n                                            FROM    #Msg\r\n                                            WHERE   ProcessName = @Process_Name\r\n                                          )\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n        DECLARE @tableHTML NVARCHAR(MAX)  \r\n        SET @tableHTML = \t\t\t\r\n\t\t\t'&lt;H3&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;' \r\n\t\t\t+ '' + @Heading + '' \r\n\t\t\t+ '&amp;nbsp;&lt;img src=&quot;http:\/\/tinymce.cachefly.net\/4.1\/plugins\/emoticons\/img\/smiley-frown.gif&quot; alt=&quot;frown&quot; \/&gt;&lt;\/H3&gt;' \r\n            + N'&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Click on the &lt;a class=&quot;btn&quot; href=&quot;https:\/\/YourReportingPlatform&quot;&gt;LINK&lt;\/a&gt; to view more detailed execution error logs or refer to the table below for info on the recent event(s).&lt;\/p&gt;'\r\n            + N'&lt;table border=&quot;1&quot;&gt;' \r\n\t\t\t+ N'&lt;tr&gt;&lt;th&gt;Package Name &lt;\/th&gt;' \r\n\t\t\t+ N'&lt;th&gt;Database Name&lt;\/th&gt;'\r\n            + N'&lt;th&gt;Execution Instance GUID&lt;\/th&gt;' \r\n\t\t\t+ N'&lt;th&gt;Package Start DateTime&lt;\/th&gt;'\r\n            + N'&lt;th&gt;Event DateTime&lt;\/th&gt;' \r\n\t\t\t+ N'&lt;th&gt;Affected Object Name&lt;\/th&gt;'\r\n            + N'&lt;th&gt;Error Procedure\/Process Name&lt;\/th&gt;'\r\n            + N'&lt;th&gt;Error Message&lt;\/th&gt;&lt;\/tr&gt;&lt;font size=&quot;2&quot;'\r\n            + CAST(( SELECT td = PackageName ,\r\n                            '' ,\r\n                            td = DatabaseName ,\r\n                            '' ,\r\n                            td = ExecutionInstanceGUID ,\r\n                            '' ,\r\n                            td = PackageStartDateTime ,\r\n                            '' ,\r\n                            td = EventDateTime ,\r\n                            '' ,\r\n                            td = ObjectName ,\r\n                            '' ,\r\n                            td = ErrorProcedure ,\r\n                            '' ,\r\n                            td = ErrorMessage ,\r\n                            ''\r\n                     FROM   #Temp\r\n                   FOR\r\n                     XML PATH('tr') ,\r\n                         TYPE\r\n                   ) AS NVARCHAR(MAX)) + N'&lt;\/font&gt;&lt;\/table&gt;';\t\t\r\n\t\t\t\t\r\n        EXEC msdb.dbo.sp_send_dbmail \r\n\t\t\t@profile_name\t=\t@DBMail_Profile_Name,\r\n            @recipients\t\t=\t@DBMail_Recipients,\r\n            @body_format\t=\t@DBMail_Msg_Body_Format,\r\n            @subject\t\t=\t@DBMail_Msg_Subject, \r\n\t\t\t@body\t\t\t=\t@tableHTML,\r\n            @importance\t\t=\t@DBMail_Msg_Importance\r\n\t\t\r\n\t\tIF OBJECT_ID('tempdb..#Temp') IS NOT NULL\r\n            BEGIN\r\n                DROP TABLE #Temp\r\n            END\t\r\n\t\tIF OBJECT_ID('tempdb..#Msg') IS NOT NULL\r\n            BEGIN\r\n                DROP TABLE &#x5B;#Msg]\r\n            END\r\n    END\r\nGO\r\n\r\n\r\n\/*====================================================================================\r\nSTEP 2\r\nCreate a row merging function to concatenate multiple e-mail addresses into a single \r\nline for error notifications e-mail distribution.\r\n====================================================================================*\/\r\nCREATE FUNCTION &#x5B;dbo].&#x5B;udf_getErrorEmailDistributionArray]\r\n    (\r\n      @servername VARCHAR(128) ,\r\n      @taskname VARCHAR(128)\r\n    )\r\nRETURNS VARCHAR(1024)\r\nAS\r\n    BEGIN\r\n        DECLARE @string VARCHAR(1024);\r\n        SELECT  @string = ( SELECT  STUFF(( SELECT  ';' + &#x5B;EmailAddress]\r\n                                            FROM    &#x5B;ControlDB].&#x5B;dbo].&#x5B;Ctrl_ErrorMsg_Notification_List]\r\n                                            WHERE   IsActive = 1\r\n                                                    AND ServerName + '\\'\r\n                                                    + InstanceName = @servername\r\n                                                    AND TaskName = @taskname\r\n                                          FOR\r\n                                            XML PATH('')\r\n                                          ), 1, 1, '') AS emailaddresses\r\n                          );\r\n        RETURN @string;\r\n    END;\r\nGO\r\n<\/pre>\n<p style=\"text-align: justify;\">A sample e-mail notification (providing database mail is enabled on the used SQL Server instance) can look as per the image below. Notice the embedded hyperlink pointing to a more detailed report which can be retrieved to analyse the error log entries on the AdminDBA database.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_Sample_Error_Email_Notification.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2966\" src=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_Sample_Error_Email_Notification.png\" alt=\"Data_Acquisition_Framework_Part1_Sample_Error_Email_Notification\" width=\"580\" height=\"272\" srcset=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_Sample_Error_Email_Notification.png 1048w, http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_Sample_Error_Email_Notification-300x141.png 300w, http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_Sample_Error_Email_Notification-768x360.png 768w, http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_Sample_Error_Email_Notification-1024x480.png 1024w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">You will notice that upon running the above scripts as well as creating AdminDBA database with all its related tables and stored procedures, the following objects\u00a0will be\u00a0available in the object explorer.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_DBsSchema_View.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2942\" src=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_DBsSchema_View.png\" alt=\"Data_Acquisition_Framework_Part1_DBsSchema_View\" width=\"580\" height=\"431\" srcset=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_DBsSchema_View.png 729w, http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_DBsSchema_View-300x223.png 300w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">One final thing in this preliminary phase is to create a linked server between the source and target databases. Since our source data resides on the remote MySQL instance, the simplest way to connect to it is through a linked server connection. In this example I have downloaded the Oracle ODBC driver for windows environment and, after installation, configured it with the source database credentials.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_Linked_MySQL_Server_Conn_Details.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2902\" src=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_Linked_MySQL_Server_Conn_Details.png\" alt=\"Data_Acquisition_Framework_Part1_Linked_MySQL_Server_Conn_Details\" width=\"580\" height=\"436\" srcset=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_Linked_MySQL_Server_Conn_Details.png 580w, http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_Linked_MySQL_Server_Conn_Details-300x226.png 300w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Once the connection configuration has been completed and we could connect to the remote host, it is just a matter of creating a linked server connection from SQL Server and validating the setup by querying remote data.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_Linked_Server_Conn_Status.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2954\" src=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/\/2016\/05\/Data_Acquisition_Framework_Part1_Linked_Server_Conn_Status.png\" alt=\"Data_Acquisition_Framework_Part1_Linked_Server_Conn_Status\" width=\"580\" height=\"207\" srcset=\"http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_Linked_Server_Conn_Status.png 660w, http:\/\/bicortex.com\/bicortex\/wp-content\/post_content\/2016\/05\/Data_Acquisition_Framework_Part1_Linked_Server_Conn_Status-300x107.png 300w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">In <a href=\"http:\/\/bicortex.com\/designing-data-acquisition-framework-in-sql-server-and-ssis-how-to-source-and-integrate-external-data-for-a-decision-support-system-or-data-warehouse-part-2\/\" target=\"_blank\">Part 2<\/a> to this series I will dive into the nuts and bolts of how large tables data can be migrated across as well as some pre-acquisition activities e.g. checking remote server connection, dropping existing indexes etc.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Note: Part 2 to this series can be found HERE, Part 3 HERE, Part 4 HERE and all the code and additional files for this post can be downloaded from my OneDrive folder HERE Introduction There is a lot of literature and Internet resources on the subject of data warehouse and decision support systems architecture, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[38,5,46,50],"tags":[10,49,19,13],"class_list":["post-2882","post","type-post","status-publish","format-standard","hentry","category-data-modelling","category-sql","category-sql-server","category-ssis","tag-data","tag-sql","tag-sql-server","tag-ssis"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/bicortex.com\/bicortex\/wp-json\/wp\/v2\/posts\/2882","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/bicortex.com\/bicortex\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/bicortex.com\/bicortex\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/bicortex.com\/bicortex\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/bicortex.com\/bicortex\/wp-json\/wp\/v2\/comments?post=2882"}],"version-history":[{"count":32,"href":"http:\/\/bicortex.com\/bicortex\/wp-json\/wp\/v2\/posts\/2882\/revisions"}],"predecessor-version":[{"id":2984,"href":"http:\/\/bicortex.com\/bicortex\/wp-json\/wp\/v2\/posts\/2882\/revisions\/2984"}],"wp:attachment":[{"href":"http:\/\/bicortex.com\/bicortex\/wp-json\/wp\/v2\/media?parent=2882"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/bicortex.com\/bicortex\/wp-json\/wp\/v2\/categories?post=2882"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/bicortex.com\/bicortex\/wp-json\/wp\/v2\/tags?post=2882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}