From 01e489c211b0a932c7c3efb9015374903f8ff293 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Tue, 24 May 2016 12:30:47 -0700 Subject: [PATCH 01/73] clarifying feature name --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ed33db38..d272248e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # SQL Server Samples Repository This GitHub repository contains code samples that demonstrate how to use Microsoft's SQL products including SQL Server, Azure SQL Database, and Azure SQL Data Warehouse. Each sample includes a README file that explains how to run and use the sample. -Note that certain features like In-Memory are edition specific for SQL Server and would be possible to implement if the edition which supports that feature is being used to run the sample. +Note that certain features like In-Memory OLTP are edition specific for SQL Server and would be possible to implement if the edition which supports that feature is being used to run the sample. ## Working in GitHub To work in GitHub, go to https://github.com/microsoft/sql-server-samples and fork the repository. Work in your own fork and when you are ready to submit to make a change or publish your sample for the first time, submit a pull request into the master branch of sql-server-samples. One of the approvers will review your request and accept or reject the pull request. From 43f37d437a5da8702a2471eca5c76842223c9fff Mon Sep 17 00:00:00 2001 From: BYHAM Date: Tue, 31 May 2016 14:54:22 -0700 Subject: [PATCH 02/73] Newest version --- .../Permissions_Poster_2016_and_SQLDB.pdf | Bin 577876 -> 579066 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/samples/features/security/Permissions_Poster_2016_and_SQLDB.pdf b/samples/features/security/Permissions_Poster_2016_and_SQLDB.pdf index 1222c171f49bf687c7b40dbe1509e0d057188526..a68dfd7c23dda93148c131e28bb0095e948ff6e0 100644 GIT binary patch delta 157255 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 R(qWZra>#*Fud} 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

b6f(=TF)0I$`PIgm4L`iD?9rR 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 dME{(A(O0 delta 156068 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

07;1eJaaO8IJStN{*^ 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%0AJ=~pP4p8m>l3f%>WOOZ2#z%q=N>N|5q;utcl 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�&P0t_j8||;D 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 From faca079f2cb5c3f398b4bfee286b83d2486d22b3 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 1 Jun 2016 16:58:19 -0700 Subject: [PATCH 03/73] adding sprocs to docs --- .../documentation/wwi-olap-catalog.md | 35 +++++++++ .../documentation/wwi-oltp-htap-catalog.md | 72 +++++++++++++++++++ .../wwi-oltp-htap-installation.md | 12 +++- 3 files changed, 118 insertions(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md b/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md index 09e81ffd..c0981906 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md +++ b/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md @@ -45,3 +45,38 @@ WideWorldImportersDW has the following dimension tables. The description include |Transaction|`Sales.CustomerTransactions` and `Purchasing.SupplierTransactions`|Measuring issue dates vs finalization dates, and amounts.| |Movement|`Warehouse.StockTransactions`|Movements over time.| |Stock Holding|`Warehouse.StockItemHoldings`|On-hand stock levels and value| + +## Stored procedures + +The stored procedures are used primarily for the ETL process and for configuration purposes. + +Any extensions of the sample are encouraged to use the `Reports` schema for Reporting Services reports, and the `PowerBI` schema for Power-BI access. + +### Application Schema + +These procedures are used to configure the sample. They are used to apply enterprise edition features to the standard edition version of the sample, add PolyBase, and reseed ETL. + +|Procedure|Purpose| +|-----------------------------|---------------------| +|Configuration_ApplyPartitionedColumnstoreIndexing|Applies both partitioning and columnstore indexes for fact tables.| +|Configuration_ConfigureForEnterpriseEdition|Applies partitioning, columnstore indexing and in-memory.| +|Configuration_EnableInMemory|Replaces the integration staging tables with SCHEMA_ONLY memory-optimized tables to improve ETL performance.| +|Configuration_ApplyPolybase|Configures an external data source, file format, and table.| +|Configuration_PopulateLargeSaleTable|Applied enterprise edition changes, then populates a larger amount of data for the 2012 calendar year as additional history.| +|Configuration_ReseedETL|Removes existing data and restarts the ETL seeds. This allows for repopulating the OLAP database to match updated rows in the OLTP database.| + +### Integration Schema + +Procedures used in the ETL process fall in these categories: +- Helper procedures for the ETL package - All Get* procedures. +- Procedures used by the ETL package for migrating staged data into the DW tables - All Migrate* procedures. +- `PopulateDateDimensionForYear` - Takes a year and ensures that all dates for that year are populated in the `Dimension.Date` table. + +### Sequences Schema + +Procedures to configure the sequences in the database. + +|Procedure|Purpose| +|-----------------------------|---------------------| +|ReseedAllSequences|Calls the procedure `ReseedSequenceBeyondTableValue` for all sequences.| +|ReseedSequenceBeyondTableValue|Used to reposition the next sequence value beyond the value in any table that uses the same sequence. (Like a `DBCC CHECKIDENT` for identity columns equivalent for sequences but across potentially multiple tables).| diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md index 75496ec4..a0f7215a 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md +++ b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md @@ -102,6 +102,78 @@ Details of stock items, their holdings and transactions. |VehicleTemperatures|Regularly recorded temperatures of vehicle chillers| |ColdRoomTemperatures|Regularly recorded temperatures of cold room chillers| +## Stored Procedures + +Stored procedures are organized in schemas. Most of the schemas are used for configuration or sample purposes. + +The `Website` schema contains the stored procedures that can be used by a Web front-end. + +The `Reports` and `PowerBI` schemas are meant for reporting services and PowerBI purposes. Any extensions of the sample are encouraged to use these schemas for reporting purposes. + +### Website schema + +These are the procedures used by a client application, such as a Web front-end. + +|Procedure|Purpose| +|-----------------------------|---------------------| +|ActivateWebsiteLogon|Allows a person (from `Application.People`) to have access to the website.| +|ChangePassword|Changes a user’s password (for users that are not using external authentication mechanisms).| +|InsertCustomerOrders|Allows inserting one or more customer orders (including the order lines).| +|InvoiceCustomerOrders|Takes a list of orders to be invoiced and processes the invoices.| +|RecordColdRoomTemperatures|Takes a sensor data list, as a table-valued parameter (TVP), and applies the data to the `Warehouse.ColdRoomTemperatures` temporal table.| +|RecordVehicleTemperature|Takes a JSON array and uses it to update `Warehouse.VehicleTemperatures`.| +|SearchForCustomers|Searches for customers by name or part of name (either the company name or the person name).| +|SearchForPeople|Searches for people by name or part of name.| +|SearchForStockItems|Searches for stock items by name or part of name or marketing comments.| +|SearchForStockItemsByTags|Searches for stock items by tags.| +|SearchForSuppliers|Searches for suppliers by name or part of name (either the company name or the person name).| + +### Integration Schema + +The stored procedures in this schema are used by the ETL process. They obtain the data needed from various tables for the timeframe required by the [ETL package](wwi-etl.md). + +### DataLoadSimulation Schema + +Simulates a workload that inserts sales and purchases. The main stored procedure is `PopulateDataToCurrentDate`, which is used to insert sample data up to the current date. + +|Procedure|Purpose| +|-----------------------------|---------------------| +|Configuration_ApplyDataLoadSimulationProcedures|Recreates the procedures needed for data load simulation. This is needed for bringing data up to the current date.| +|Configuration_RemoveDataLoadSimulationProcedures|This removes the procedures again after data simulation is complete.| +|DeactiveTemporalTablesBeforeDataLoad|Removes the temporal nature of all temporal tables and where applicable, applies a trigger so that changes can be made as though they were being applied at an earlier date than the sys-temporal tables allow.| +|PopulateDataToCurrentDate|Used to bring the data up to the current date. Should be run before any other configuration options after restoring the database from an initial backup.| +|ReactivateTemporalTablesAfterDataLoad|Re-establishes the temporal tables, including checking for data consistency. (Removes the associated triggers).| + + +### Application Schema + +These procedures are used to configure the sample. They are used to apply enterprise edition features to the standard edition version of the sample, and also to add auditing and full-text indexing. + +|Procedure|Purpose| +|-----------------------------|---------------------| +|AddRoleMemberIfNonexistant|Adds a member to a role if the member isn’t already in the role| +|Configuration_ApplyAuditing|Adds auditing. Server auditing is applied for standard edition databases; additional database auditing is added for enterprise edition.| +|Configuration_ApplyColumnstoreIndexing|Applies columnstore indexing to `Sales.OrderLines` and `Sales.InvoiceLines` and reindexes appropriately.| +|Configuration_ApplyFullTextIndexing|Applies fulltext indexes to `Application.People`, `Sales.Customers`, `Purchasing.Suppliers`, and `Warehouse.StockItems`. Replaces `Website.SearchForPeople`, `Website.SearchForSuppliers`, `Website.SearchForCustomers`, `Website.SearchForStockItems`, `Website.SearchForStockItemsByTags` with replacement procedures that use fulltext indexing.| +|Configuration_ApplyPartitioning|Applies table partitioning to `Sales.CustomerTransactions and `Purchasing.SupplierTransactions`, and rearranges the indexes to suit.| +|Configuration_ApplyPolybase|Configures an external data source, file format, and table.| +|Configuration_ApplyRowLevelSecurity|Applies row level security to filter customers by sales territory related roles.| +|Configuration_ConfigureForEnterpriseEdition|Applies columnstore indexing, full text, in-memory, polybase, and partitioning.| +|Configuration_EnableInMemory|Adds a memory-optimized filegroup (when not working in Azure), replaces `Warehouse.ColdRoomTemperatures`, `Warehouse.VehicleTemperatures` with in-memory equivalents, and migrates the data, recreates the `Website.OrderIDList`, `Website.OrderList`, `Website.OrderLineList`, `Website.SensorDataList` table types with memory-optimized equivalents, drops and recreates the procedures `Website.InvoiceCustomerOrders`, `Website.InsertCustomerOrders`, and `Website.RecordColdRoomTemperatures` that uses these table types.| +|Configuration_RemoveAuditing|Removes the auditing configuration.| +|Configuration_RemoveRowLevelSecurity|Removes the row level security configuration (this is needed for changes to the associated tables).| +|CreateRoleIfNonExistant|Creates a database role if it doesn’t already exist.| + + +### Sequences Schema + +Procedures to configure the sequences in the database. + +|Procedure|Purpose| +|-----------------------------|---------------------| +|ReseedAllSequences|Calls the procedure ReseedSequenceBeyondTableValue for all sequences.| +|ReseedSequenceBeyondTableValue|Used to reposition the next sequence value beyond the value in any table that uses the same sequence. (Like a DBCC CHECKIDENT for identity columns equivalent for sequences but across potentially multiple tables).| + ## Design considerations diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md index 35031721..0b4735c9 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md +++ b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md @@ -43,9 +43,19 @@ To import a bacpac into a new SQL Database, you can use Management Studio. ## Configuration -The sample database can make use of Full-Text Indexing. However, that feature is not installed by default with SQL Server - you need to select it during SQL Server setup. Therefore, a post-installation step is required. +### Full-Text Indexing + +The sample database can make use of Full-Text Indexing. However, that feature is not installed by default with SQL Server - you need to select it during SQL Server setup (it is enabled by default in Azure SQL DB). Therefore, a post-installation step is required. 1. In SQL Server Management Studio, connect to the WideWorldImporters database and open a new query window. 2. Run the following T-SQL command to enable the use of Full-Text Indexing in the database: EXECUTE Application.Configuration_ApplyFullTextIndexing + +### SQL Server Audit + +Enabling auditing in SQL Server requires server configuration. To enable SQL Server audit for the WideWorldImporters sample, run the following statement in the database: + + EXECUTE [Application].[Configuration_ApplyAuditing] + +In Azure SQL Database, Audit is configured through the [Azure portal](https://portal.azure.com/). From 039ebaab47cbf78c7e5fdb62d7abe0bc884ed975 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 1 Jun 2016 17:00:30 -0700 Subject: [PATCH 04/73] moving section --- .../documentation/wwi-oltp-htap-catalog.md | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md index a0f7215a..9daf521b 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md +++ b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md @@ -102,6 +102,34 @@ Details of stock items, their holdings and transactions. |VehicleTemperatures|Regularly recorded temperatures of vehicle chillers| |ColdRoomTemperatures|Regularly recorded temperatures of cold room chillers| + +## Design considerations + +Database design is subjective and there is no right or wrong way to design a database. The schemas and tables in this database show ideas for how you can design your own database. + +### Schema design + +WideWorldImporters uses a small number of schemas so that it is easy to understand the database system and demonstrate database principles. + +Wherever possible, the database collocates tables that are commonly queried together into the same schema to minimize join complexity. + +The database schema has been code-generated based on a series of metadata tables in another database WWI_Preparation. This gives WideWorldImporters a very high degree of design consistency, naming consistency, and completeness. For details on how the schema has been generated see the source code: [wide-world-importers/wwi-database-scripts](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers/wwi-database-scripts) + +### Table design + +- All tables have single column primary keys for join simplicity. +- All schemas, tables, columns, indexes, and check constraints have a Description extended property that can be used to identify the purpose of the object or column. Memory-optimized tables are an exception to this since they don’t currently support extended properties. +- All foreign keys are automatically indexed unless there is another non-clustered index that has the same left-hand component. +- Auto-numbering in tables is based on sequences. These sequences are easier to work with across linked servers and similar environments than IDENTITY columns. Memory-optimized tables use IDENTITY columns since they don’t support in SQL Server 2016. +- A single sequence (TransactionID) is used for these tables: CustomerTransactions, SupplierTransactions, and StockItemTransactions. This demonstrates how a set of tables can have a single sequence. +- Some columns have appropriate default values. + +### Security schemas + +For security, WideWorldImporters does not allow external applications to access data schemas directly. To isolate access, WideWorldImporters uses security-access schemas that do not hold data, but contain views and stored procedures. External applications use the security schemas to retrieve the data that they are allowed to view. This way, users can only run the views and stored procedures in the secure-access schemas + +For example, this sample includes Power BI dashboards. An external application accesses these Power BI dashboards from the Power BI gateway as a user that has read-only permission on the PowerBI schema. For read-only permission, the user only needs SELECT and EXECUTE permission on the PowerBI schema. A database administrator at WWI assigns these permissions as needed. + ## Stored Procedures Stored procedures are organized in schemas. Most of the schemas are used for configuration or sample purposes. @@ -156,7 +184,6 @@ These procedures are used to configure the sample. They are used to apply enterp |Configuration_ApplyColumnstoreIndexing|Applies columnstore indexing to `Sales.OrderLines` and `Sales.InvoiceLines` and reindexes appropriately.| |Configuration_ApplyFullTextIndexing|Applies fulltext indexes to `Application.People`, `Sales.Customers`, `Purchasing.Suppliers`, and `Warehouse.StockItems`. Replaces `Website.SearchForPeople`, `Website.SearchForSuppliers`, `Website.SearchForCustomers`, `Website.SearchForStockItems`, `Website.SearchForStockItemsByTags` with replacement procedures that use fulltext indexing.| |Configuration_ApplyPartitioning|Applies table partitioning to `Sales.CustomerTransactions and `Purchasing.SupplierTransactions`, and rearranges the indexes to suit.| -|Configuration_ApplyPolybase|Configures an external data source, file format, and table.| |Configuration_ApplyRowLevelSecurity|Applies row level security to filter customers by sales territory related roles.| |Configuration_ConfigureForEnterpriseEdition|Applies columnstore indexing, full text, in-memory, polybase, and partitioning.| |Configuration_EnableInMemory|Adds a memory-optimized filegroup (when not working in Azure), replaces `Warehouse.ColdRoomTemperatures`, `Warehouse.VehicleTemperatures` with in-memory equivalents, and migrates the data, recreates the `Website.OrderIDList`, `Website.OrderList`, `Website.OrderLineList`, `Website.SensorDataList` table types with memory-optimized equivalents, drops and recreates the procedures `Website.InvoiceCustomerOrders`, `Website.InsertCustomerOrders`, and `Website.RecordColdRoomTemperatures` that uses these table types.| @@ -173,31 +200,3 @@ Procedures to configure the sequences in the database. |-----------------------------|---------------------| |ReseedAllSequences|Calls the procedure ReseedSequenceBeyondTableValue for all sequences.| |ReseedSequenceBeyondTableValue|Used to reposition the next sequence value beyond the value in any table that uses the same sequence. (Like a DBCC CHECKIDENT for identity columns equivalent for sequences but across potentially multiple tables).| - - -## Design considerations - -Database design is subjective and there is no right or wrong way to design a database. The schemas and tables in this database show ideas for how you can design your own database. - -### Schema design - -WideWorldImporters uses a small number of schemas so that it is easy to understand the database system and demonstrate database principles. - -Wherever possible, the database collocates tables that are commonly queried together into the same schema to minimize join complexity. - -The database schema has been code-generated based on a series of metadata tables in another database WWI_Preparation. This gives WideWorldImporters a very high degree of design consistency, naming consistency, and completeness. For details on how the schema has been generated see the source code: [wide-world-importers/wwi-database-scripts](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers/wwi-database-scripts) - -### Table design - -- All tables have single column primary keys for join simplicity. -- All schemas, tables, columns, indexes, and check constraints have a Description extended property that can be used to identify the purpose of the object or column. Memory-optimized tables are an exception to this since they don’t currently support extended properties. -- All foreign keys are automatically indexed unless there is another non-clustered index that has the same left-hand component. -- Auto-numbering in tables is based on sequences. These sequences are easier to work with across linked servers and similar environments than IDENTITY columns. Memory-optimized tables use IDENTITY columns since they don’t support in SQL Server 2016. -- A single sequence (TransactionID) is used for these tables: CustomerTransactions, SupplierTransactions, and StockItemTransactions. This demonstrates how a set of tables can have a single sequence. -- Some columns have appropriate default values. - -### Security schemas - -For security, WideWorldImporters does not allow external applications to access data schemas directly. To isolate access, WideWorldImporters uses security-access schemas that do not hold data, but contain views and stored procedures. External applications use the security schemas to retrieve the data that they are allowed to view. This way, users can only run the views and stored procedures in the secure-access schemas - -For example, this sample includes Power BI dashboards. An external application accesses these Power BI dashboards from the Power BI gateway as a user that has read-only permission on the PowerBI schema. For read-only permission, the user only needs SELECT and EXECUTE permission on the PowerBI schema. A database administrator at WWI assigns these permissions as needed. From 4fa6501c896747dfda399dc2d87aad4ccc781b54 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 1 Jun 2016 17:02:28 -0700 Subject: [PATCH 05/73] fix --- .../wide-world-importers/documentation/wwi-olap-catalog.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md b/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md index c0981906..a1fd0fd2 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md +++ b/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md @@ -35,7 +35,7 @@ WideWorldImportersDW has the following dimension tables. The description include ### Fact tables -WideWorldImportersDW has the following dimension tables. The description includes the relationship with the source tables in the WideWorldImporters database, as well as the classes of analytics/reporting queries each fact table is typically used with. +WideWorldImportersDW has the following fact tables. The description includes the relationship with the source tables in the WideWorldImporters database, as well as the classes of analytics/reporting queries each fact table is typically used with. |Table|Source tables|Sample Analytics| |-----------------------------|---------------------| @@ -44,7 +44,8 @@ WideWorldImportersDW has the following dimension tables. The description include |Purchase|`Purchasing.PurchaseOrderLines`|Expected vs actual lead times| |Transaction|`Sales.CustomerTransactions` and `Purchasing.SupplierTransactions`|Measuring issue dates vs finalization dates, and amounts.| |Movement|`Warehouse.StockTransactions`|Movements over time.| -|Stock Holding|`Warehouse.StockItemHoldings`|On-hand stock levels and value| +|Stock Holding|`Warehouse.StockItemHoldings`|On-hand stock levels and value.| + ## Stored procedures From cdcc6e7620e617de1c20e8d1b89125e6a148071f Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 1 Jun 2016 17:03:55 -0700 Subject: [PATCH 06/73] z --- .../wide-world-importers/documentation/wwi-olap-catalog.md | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md b/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md index a1fd0fd2..c2b4aef3 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md +++ b/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md @@ -46,7 +46,6 @@ WideWorldImportersDW has the following fact tables. The description includes the |Movement|`Warehouse.StockTransactions`|Movements over time.| |Stock Holding|`Warehouse.StockItemHoldings`|On-hand stock levels and value.| - ## Stored procedures The stored procedures are used primarily for the ETL process and for configuration purposes. From 73dec5322657e874f73ca94f8505845afd2c92dd Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 1 Jun 2016 17:04:57 -0700 Subject: [PATCH 07/73] fix in table --- .../wide-world-importers/documentation/wwi-olap-catalog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md b/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md index c2b4aef3..88e5c093 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md +++ b/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md @@ -38,7 +38,7 @@ WideWorldImportersDW has the following dimension tables. The description include WideWorldImportersDW has the following fact tables. The description includes the relationship with the source tables in the WideWorldImporters database, as well as the classes of analytics/reporting queries each fact table is typically used with. |Table|Source tables|Sample Analytics| -|-----------------------------|---------------------| +|-----------------------------|---------------------|---------------------| |Order|`Sales.Orders` and `Sales.OrderLines`|Sales people, picker/packer productivity, and on time to pick orders. In addition, low stock situations leading to back orders.| |Sale|`Sales.Invoices` and `Sales.InvoiceLines`|Sales dates, delivery dates, profitability over time, profitability by sales person.| |Purchase|`Purchasing.PurchaseOrderLines`|Expected vs actual lead times| From 195dd380103ae6551047d442fff7513119412392 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 09:17:37 -0700 Subject: [PATCH 08/73] updates to DB generation scripts to follow best practices --- ...onstruct-database-from-metadata-tables.sql | 319 +-- ...wi-configure-required-database-objects.sql | 1894 ++++++++--------- ...onstruct-database-from-metadata-tables.sql | 223 +- ...dw-configure-required-database-objects.sql | 616 +++--- 4 files changed, 1529 insertions(+), 1523 deletions(-) diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql b/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql index 092d3cf5..2ada9ba7 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql @@ -82,50 +82,59 @@ DECLARE @PrimaryKeyColumn nvarchar(max) = N''; SET @SQL = N''; -SET @SQL += N'USE master;' + @CrLf + @CrLf +SET @SQL += N'USE master;' + @CrLf + @CrLf + N'IF EXISTS(SELECT 1 FROM sys.databases WHERE name = N''WideWorldImporters'')' + @CrLf - + N'BEGIN' + @CrLf - + N' ALTER DATABASE WideWorldImporters SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' + @CrLf + + N'BEGIN' + @CrLf + + N' ALTER DATABASE WideWorldImporters SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' + @CrLf + N' DROP DATABASE WideWorldImporters;' + @CrLf + N'END;' + @CrLf + @GO - + N'CREATE DATABASE WideWorldImporters' + @CrLf - + N'ON' + @CrLf + + N'CREATE DATABASE WideWorldImporters' + @CrLf + + N'ON PRIMARY' + @CrLf + N'( ' + @CrLf - + N' NAME = WWI_Data,' + @CrLf + + N' NAME = WWI_Primary,' + @CrLf + N' FILENAME = ''' + @SQLDataFolder + N'WideWorldImporters.mdf'',' + @CrLf + + N' SIZE = 1GB,' + @CrLf + + N' MAXSIZE = UNLIMITED,' + @CrLf + + N' FILEGROWTH = 64MB' + @CrLf + + N'),' + @CrLf + + N'FILEGROUP USERDATA DEFAULT' + @CrLf + + N'( ' + @CrLf + + N' NAME = WWI_UserData,' + @CrLf + + N' FILENAME = ''' + @SQLDataFolder + N'WideWorldImporters_UserData.ndf'',' + @CrLf + N' SIZE = 2GB,' + @CrLf + N' MAXSIZE = UNLIMITED,' + @CrLf - + N' FILEGROWTH = 64MB' + @CrLf - + N')' + @CrLf - + N'LOG ON' + @CrLf - + N'(' + @CrLf - + N' NAME = WWI_Log,' + @CrLf - + N' FILENAME = ''' + @SQLLogFolder + N'WideWorldImporters.ldf'',' + @CrLf - + N' SIZE = 100MB,' + @CrLf - + N' MAXSIZE = UNLIMITED,' + @CrLf + N' FILEGROWTH = 64MB' + @CrLf - + N')' + @CrLf + + N')' + @CrLf + + N'LOG ON' + @CrLf + + N'(' + @CrLf + + N' NAME = WWI_Log,' + @CrLf + + N' FILENAME = ''' + @SQLLogFolder + N'WideWorldImporters.ldf'',' + @CrLf + + N' SIZE = 100MB,' + @CrLf + + N' MAXSIZE = UNLIMITED,' + @CrLf + + N' FILEGROWTH = 64MB' + @CrLf + + N')' + @CrLf + N'COLLATE Latin1_General_100_CI_AS;' + @CrLf + @GO + N'ALTER DATABASE WideWorldImporters SET RECOVERY SIMPLE;' + @CrLf + @GO + + N'ALTER DATABASE WideWorldImporters SET AUTO_UPDATE_STATISTICS_ASYNC ON;' + @CrLf + @GO + N'ALTER AUTHORIZATION ON DATABASE::WideWorldImporters to sa;' + @CrLf + @GO + N'ALTER DATABASE WideWorldImporters' + @CrLf + N'SET QUERY_STORE' + @CrLf - + N'(' + @CrLf - + @Indent + N'OPERATION_MODE = READ_WRITE,' + @CrLf + + N'(' + @CrLf + + @Indent + N'OPERATION_MODE = READ_WRITE,' + @CrLf + @Indent + N'CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),' + @CrLf - + @Indent + N'DATA_FLUSH_INTERVAL_SECONDS = 3000,' + @CrLf - + @Indent + N'MAX_STORAGE_SIZE_MB = 500,' + @CrLf - + @Indent + N'INTERVAL_LENGTH_MINUTES = 15,' + @CrLf - + @Indent + N'SIZE_BASED_CLEANUP_MODE = AUTO,' + @CrLf - + @Indent + N'QUERY_CAPTURE_MODE = AUTO,' + @CrLf - + @Indent + N'MAX_PLANS_PER_QUERY = 1000' + @CrLf + + @Indent + N'DATA_FLUSH_INTERVAL_SECONDS = 3000,' + @CrLf + + @Indent + N'MAX_STORAGE_SIZE_MB = 500,' + @CrLf + + @Indent + N'INTERVAL_LENGTH_MINUTES = 15,' + @CrLf + + @Indent + N'SIZE_BASED_CLEANUP_MODE = AUTO,' + @CrLf + + @Indent + N'QUERY_CAPTURE_MODE = AUTO,' + @CrLf + + @Indent + N'MAX_PLANS_PER_QUERY = 1000' + @CrLf + N');' + @CrLf + @GO + N'USE WideWorldImporters;' + @CrLf + @GO; DECLARE SchemaList CURSOR FAST_FORWARD READ_ONLY FOR SELECT SchemaName, SchemaDescription -FROM Metadata.[Schemas] +FROM Metadata.[Schemas] ORDER BY SchemaID; OPEN SchemaList; @@ -148,8 +157,8 @@ SET @SQL += @CrLf; DECLARE SequenceList CURSOR FAST_FORWARD READ_ONLY FOR -SELECT DISTINCT DefaultSequenceName, DataType -FROM Metadata.[Columns] +SELECT DISTINCT DefaultSequenceName, DataType +FROM Metadata.[Columns] WHERE DefaultSequenceName IS NOT NULL ORDER BY DefaultSequenceName; @@ -157,7 +166,7 @@ OPEN SequenceList; FETCH NEXT FROM SequenceList INTO @DefaultSequenceName, @DataType; WHILE @@FETCH_STATUS = 0 BEGIN - SET @SQL += N'CREATE SEQUENCE ' + QUOTENAME(N'Sequences') + N'.' + QUOTENAME(@DefaultSequenceName) + N' AS ' + LOWER(@DataType) + SET @SQL += N'CREATE SEQUENCE ' + QUOTENAME(N'Sequences') + N'.' + QUOTENAME(@DefaultSequenceName) + N' AS ' + LOWER(@DataType) + N' START WITH 1;' + @CrLf; SET @AnySequencesCreated = 1; FETCH NEXT FROM SequenceList INTO @DefaultSequenceName, @DataType; @@ -172,17 +181,17 @@ END; DECLARE TableList CURSOR FAST_FORWARD READ_ONLY FOR -SELECT SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription -FROM Metadata.[Tables] +SELECT SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription +FROM Metadata.[Tables] ORDER BY TableCreationOrder; OPEN TableList; -FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeTemporalColumns, +FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeTemporalColumns, @IncludeModificationTrackingColumns, @TableDescription; WHILE @@FETCH_STATUS = 0 BEGIN - + -- Start creating the next table SET @SQL += N'CREATE TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + @CrLf + N'(' + @CrLf; @@ -191,34 +200,34 @@ BEGIN SET @ExtendedPropertySQL = N'EXEC sys.sp_addextendedproperty @name = N''Description'', @value = N''' + REPLACE(@TableDescription, N'''', N'''''') + N''', ' + N'@level0type = N''SCHEMA'', @level0name = ''' + @SchemaName + N''', ' + N'@level1type = N''TABLE'', @level1name = ''' + @TableName + N''';' + @CrLf + @CrLf; - + DECLARE ColumnList CURSOR FAST_FORWARD READ_ONLY FOR SELECT ColumnName, IsPrimaryKeyColumn, DataType, IsNullable, MaximumLength, DecimalPrecision, DecimalScale, HasDefaultValue, UsesSequenceDefault, DefaultSequenceName, - DefaultValue, IsUnique, HasForeignKeyReference, + DefaultValue, IsUnique, HasForeignKeyReference, (SELECT SchemaName FROM Metadata.Tables AS t WHERE t.TableName = ForeignKeyTable) AS ForeignKeySchema, ForeignKeyTable, ForeignKeyColumn, AutomaticallyIndexForeignKey, ColumnDescription FROM Metadata.[Columns] - WHERE TableName = @TableName + WHERE TableName = @TableName ORDER BY ColumnID; - + OPEN ColumnList; - FETCH NEXT FROM ColumnList + FETCH NEXT FROM ColumnList INTO @ColumnName, @IsPrimaryKeyColumn, @DataType, @IsNullable, @MaximumLength, @DecimalPrecision, @DecimalScale, @HasDefaultValue, @UsesSequenceDefault, @DefaultSequenceName, @DefaultValue, @IsUnique, @HasForeignKeyReference, @ForeignKeySchema, @ForeignKeyTable, @ForeignKeyColumn, @AutomaticallyIndexForeignKey, @ColumnDescription; - + WHILE @@FETCH_STATUS = 0 BEGIN - + IF @FirstColumnOfTable = 0 BEGIN SET @SQL += N',' + @CrLf; END; SET @FirstColumnOfTable = 0; - + IF UPPER(LEFT(@DataType, 2)) = N'AS' BEGIN SET @SQL += @Indent + QUOTENAME(@ColumnName) + N' ' + @DataType; @@ -232,7 +241,7 @@ BEGIN THEN N'(7)' ELSE N'' END; - + SET @SQL += CASE WHEN @IsNullable = 0 THEN N' NOT' ELSE N'' END + N' NULL'; @@ -240,44 +249,44 @@ BEGIN BEGIN SET @SQL += N' IDENTITY(1,1)'; END; - END; -- of if not a calculated column - + END; -- of if not a calculated column + IF @IsPrimaryKeyColumn <> 0 BEGIN - SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + QUOTENAME(N'PK_' + @SchemaName + N'_' + @TableName) + N' PRIMARY KEY'; END; - + IF @IsPrimaryKeyColumn = 0 AND @IsUnique <> 0 BEGIN - SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + QUOTENAME(N'UQ_' + @SchemaName + N'_' + @TableName + N'_' + @ColumnName) + N' UNIQUE'; END; - + IF @HasDefaultValue <> 0 AND @DefaultSequenceName IS NOT NULL BEGIN - SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + QUOTENAME(N'DF_' + @SchemaName + N'_' + @TableName + N'_' + @ColumnName) + @CrLf + @Indent + @Indent + @Indent + N'DEFAULT(' - + CASE WHEN @UsesSequenceDefault <> 0 + + CASE WHEN @UsesSequenceDefault <> 0 THEN N'NEXT VALUE FOR ' + QUOTENAME(N'Sequences') + N'.' + QUOTENAME(@DefaultSequenceName) - ELSE @DefaultValue + ELSE @DefaultValue END + N')'; END; - - IF @HasForeignKeyReference <> 0 + + IF @HasForeignKeyReference <> 0 BEGIN - SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' - + QUOTENAME(CASE WHEN @IsPrimaryKeyColumn <> 0 THEN N'PK' ELSE N'' END - + N'FK_' + @SchemaName + N'_' + @TableName + N'_' + @ColumnName - + N'_' + @ForeignKeySchema + N'_' + @ForeignKeyTable) - + @CrLf + @Indent + @Indent + @Indent + SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + + QUOTENAME(CASE WHEN @IsPrimaryKeyColumn <> 0 THEN N'PK' ELSE N'' END + + N'FK_' + @SchemaName + N'_' + @TableName + N'_' + @ColumnName + + N'_' + @ForeignKeySchema + N'_' + @ForeignKeyTable) + + @CrLf + @Indent + @Indent + @Indent + N'FOREIGN KEY REFERENCES ' + QUOTENAME(@ForeignKeySchema) + N'.' + QUOTENAME(@ForeignKeyTable) + N' (' + QUOTENAME(@ForeignKeyColumn) + N')'; IF @IncludeForeignKeyIndexes <> 0 AND @IsPrimaryKeyColumn = 0 AND @AutomaticallyIndexForeignKey <> 0 BEGIN - SET @ForeignKeyIndexSQL += N'CREATE INDEX ' + SET @ForeignKeyIndexSQL += N'CREATE INDEX ' + QUOTENAME(N'FK_' + @SchemaName + N'_' + @TableName + N'_' + @ColumnName) + @CrLf + N'ON ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + N' (' + QUOTENAME(@ColumnName) + N');' + @CrLf; @@ -288,13 +297,13 @@ BEGIN END; END; - + SET @ExtendedPropertySQL += N'EXEC sys.sp_addextendedproperty @name = N''Description'', @value = ''' + REPLACE(@ColumnDescription, N'''', N'''''') + N''', @level0type = N''SCHEMA'', @level0name = ''' + @SchemaName + N''', ' + N'@level1type = N''TABLE'', @level1name = ''' + @TableName + N''', ' + N'@level2type = N''COLUMN'', @level2name = ''' + @ColumnName + N''';' + @CrLf; - FETCH NEXT FROM ColumnList + FETCH NEXT FROM ColumnList INTO @ColumnName, @IsPrimaryKeyColumn, @DataType, @IsNullable, @MaximumLength, @DecimalPrecision, @DecimalScale, @HasDefaultValue, @UsesSequenceDefault, @DefaultSequenceName, @DefaultValue, @IsUnique, @HasForeignKeyReference, @ForeignKeySchema, @ForeignKeyTable, @ForeignKeyColumn, @AutomaticallyIndexForeignKey, @@ -311,17 +320,17 @@ BEGIN SET @SQL += N',' + @CrLf; END; SET @FirstColumnOfTable = 0; - - SET @SQL += @Indent + QUOTENAME(@LastEditedByColumnName) + N' int NOT NULL' + @CrLf - + @Indent + @Indent + N'CONSTRAINT ' - + QUOTENAME(N'FK_' + @SchemaName + N'_' + @TableName + + SET @SQL += @Indent + QUOTENAME(@LastEditedByColumnName) + N' int NOT NULL' + @CrLf + + @Indent + @Indent + N'CONSTRAINT ' + + QUOTENAME(N'FK_' + @SchemaName + N'_' + @TableName + N'_' + @LastEditedByFKSchemaName + N'_' + @LastEditedByFKTableName) + @CrLf - + @Indent + @Indent + @Indent + + @Indent + @Indent + @Indent + N'FOREIGN KEY REFERENCES ' + QUOTENAME(@LastEditedByFKSchemaName) + N'.' + QUOTENAME(@LastEditedByFKTableName) - + N' (' + QUOTENAME(@LastEditedByFKColumnName) + N')' + + N' (' + QUOTENAME(@LastEditedByFKColumnName) + N')' + CASE WHEN @IncludeTemporalColumns <> 0 THEN N'' ELSE N',' + @CrLf + @Indent + QUOTENAME(@LastEditedWhenColumnName) + N' datetime2(7) NOT NULL' + @CrLf - + @Indent + @Indent + N'CONSTRAINT ' + + @Indent + @Indent + N'CONSTRAINT ' + QUOTENAME(N'DF_' + @SchemaName + N'_' + @TableName + N'_' + @LastEditedWhenColumnName) + @CrLf + @Indent + @Indent + @Indent + N'DEFAULT(SYSDATETIME())' END; @@ -334,21 +343,21 @@ BEGIN SET @SQL += N',' + @CrLf; END; SET @FirstColumnOfTable = 0; - + SET @SQL += @Indent + QUOTENAME(@TemporalFromColumnName) + N' datetime2(7) GENERATED ALWAYS AS ROW START,' + @CrLf + @Indent + QUOTENAME(@TemporalToColumnName) + N' datetime2(7) GENERATED ALWAYS AS ROW END,' + @CrLf - + @Indent + N'PERIOD FOR SYSTEM_TIME (' + QUOTENAME(@TemporalFromColumnName) + + @Indent + N'PERIOD FOR SYSTEM_TIME (' + QUOTENAME(@TemporalFromColumnName) + N',' + QUOTENAME(@TemporalToColumnName) + N')'; END; -- of if temporal included -- Finish creating the table SET @SQL += @CrLf + N')'; - + IF @IncludeTemporalColumns <> 0 BEGIN SET @SQL += @CrLf + N'WITH ' + @CrLf + N'(' + @CrLf - + @Indent + N'SYSTEM_VERSIONING = ON (HISTORY_TABLE = ' + + @Indent + N'SYSTEM_VERSIONING = ON (HISTORY_TABLE = ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName + N'_' + @TemporalTableSuffix) + N')' + @CrLf + N')'; END; @@ -362,14 +371,14 @@ BEGIN SET @SQL += @ForeignKeyIndexSQL + @GO; END; END; - + DECLARE ConstraintList CURSOR FAST_FORWARD READ_ONLY FOR - SELECT ConstraintName, ConstraintDefinition, ConstraintDescription + SELECT ConstraintName, ConstraintDefinition, ConstraintDescription FROM Metadata.[Constraints] - WHERE TableName = @TableName + WHERE TableName = @TableName ORDER BY [ConstraintID]; - + OPEN ConstraintList; FETCH NEXT FROM ConstraintList INTO @ConstraintName, @ConstraintDefinition, @ConstraintDescription; WHILE @@FETCH_STATUS = 0 @@ -393,9 +402,9 @@ BEGIN FOR SELECT IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription FROM Metadata.[Indexes] - WHERE TableName = @TableName + WHERE TableName = @TableName ORDER BY [IndexID]; - + OPEN IndexList; FETCH NEXT FROM IndexList INTO @IndexName, @IndexColumns, @IncludedColumns, @IsUnique, @FilterClause, @IndexDescription; WHILE @@FETCH_STATUS = 0 @@ -425,21 +434,21 @@ BEGIN DECLARE MaskedColumnList CURSOR FAST_FORWARD READ_ONLY FOR - SELECT ColumnName, ColumnMaskFunction + SELECT ColumnName, ColumnMaskFunction FROM Metadata.[Columns] - WHERE TableName = @TableName + WHERE TableName = @TableName AND ColumnMaskFunction IS NOT NULL ORDER BY ColumnID; - + OPEN MaskedColumnList; - FETCH NEXT FROM MaskedColumnList + FETCH NEXT FROM MaskedColumnList INTO @ColumnName, @ColumnMaskFunction; - + WHILE @@FETCH_STATUS = 0 BEGIN - SET @SQL += N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + @CrLf + SET @SQL += N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + @CrLf + @Indent + N'ALTER COLUMN ' + QUOTENAME(@ColumnName) + N' ADD MASKED WITH (FUNCTION = ''' + @ColumnMaskFunction + N''');' + @CrLf + @GO; - FETCH NEXT FROM MaskedColumnList + FETCH NEXT FROM MaskedColumnList INTO @ColumnName, @ColumnMaskFunction; END; @@ -451,7 +460,7 @@ BEGIN SET @SQL += @ExtendedPropertySQL + @GO; END; - FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeTemporalColumns, + FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeTemporalColumns, @IncludeModificationTrackingColumns, @TableDescription; END; -- of for each table @@ -461,41 +470,41 @@ DEALLOCATE TableList; IF @AnySequencesCreated <> 0 BEGIN SET @SQL += N'CREATE PROCEDURE Sequences.ReseedSequenceBeyondTableValues' + @CrLf - + N'@SequenceName sysname, ' + @CrLf - + N'@SchemaName sysname, ' + @CrLf - + N'@TableName sysname, ' + @CrLf - + N'@ColumnName sysname ' + @CrLf + + N'@SequenceName sysname, ' + @CrLf + + N'@SchemaName sysname, ' + @CrLf + + N'@TableName sysname, ' + @CrLf + + N'@ColumnName sysname ' + @CrLf + N'AS BEGIN' + @CrLf - + @Indent + N'-- Ensures that the next sequence value is above the maximum value of the supplied table column' + @CrLf - + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf - + @Indent + N'DECLARE @SQL nvarchar(max);' + @CrLf - + @Indent + N'DECLARE @CurrentTableMaximumValue bigint;' + @CrLf - + @Indent + N'DECLARE @NewSequenceValue bigint;' + @CrLf + + @Indent + N'-- Ensures that the next sequence value is above the maximum value of the supplied table column' + @CrLf + + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf + + @Indent + N'DECLARE @SQL nvarchar(max);' + @CrLf + + @Indent + N'DECLARE @CurrentTableMaximumValue bigint;' + @CrLf + + @Indent + N'DECLARE @NewSequenceValue bigint;' + @CrLf + @Indent + N'DECLARE @CurrentSequenceMaximumValue bigint' + @CrLf + @Indent + @Indent + N'= (SELECT CAST(current_value AS bigint) FROM sys.sequences' + @CrLf + @Indent + @Indent + N' WHERE name = @SequenceName' + @CrLf - + @Indent + @Indent + N' AND SCHEMA_NAME(schema_id) = N''Sequences'');' + @CrLf + + @Indent + @Indent + N' AND SCHEMA_NAME(schema_id) = N''Sequences'');' + @CrLf + @Indent + N'CREATE TABLE #CurrentValue' + @CrLf - + @Indent + N'(' + @CrLf + + @Indent + N'(' + @CrLf + @Indent + @Indent + N'CurrentValue bigint' + @CrLf - + @Indent + N')' + @CrLf + @CrLf + + @Indent + N')' + @CrLf + @CrLf + @Indent + N'SET @SQL = N''INSERT #CurrentValue (CurrentValue) ' + N'SELECT COALESCE(MAX('' + QUOTENAME(@ColumnName) + N''), 0) ' + N'FROM '' + QUOTENAME(@SchemaName) + N''.'' + QUOTENAME(@TableName) + N'';'';' + @CrLf - + @Indent + N'EXECUTE (@SQL);' + @CrLf - + @Indent + N'SET @CurrentTableMaximumValue = (SELECT CurrentValue FROM #CurrentValue);' + @CrLf - + @Indent + N'DROP TABLE #CurrentValue;' + @CrLf + @CrLf + + @Indent + N'EXECUTE (@SQL);' + @CrLf + + @Indent + N'SET @CurrentTableMaximumValue = (SELECT CurrentValue FROM #CurrentValue);' + @CrLf + + @Indent + N'DROP TABLE #CurrentValue;' + @CrLf + @CrLf + @Indent + N'IF @CurrentTableMaximumValue >= @CurrentSequenceMaximumValue' + @CrLf - + @Indent + N'BEGIN' + @CrLf - + @Indent + @Indent + N'SET @NewSequenceValue = @CurrentTableMaximumValue + 1;' + @CrLf - + @Indent + @Indent + N'SET @SQL = N''ALTER SEQUENCE Sequences.'' + QUOTENAME(@SequenceName) + N'' RESTART WITH '' + CAST(@NewSequenceValue AS nvarchar(20)) + N'';'';' + @CrLf - + @Indent + @Indent + N'EXECUTE (@SQL);' + @CrLf - + @Indent + N'END;' + @CrLf + + @Indent + N'BEGIN' + @CrLf + + @Indent + @Indent + N'SET @NewSequenceValue = @CurrentTableMaximumValue + 1;' + @CrLf + + @Indent + @Indent + N'SET @SQL = N''ALTER SEQUENCE Sequences.'' + QUOTENAME(@SequenceName) + N'' RESTART WITH '' + CAST(@NewSequenceValue AS nvarchar(20)) + N'';'';' + @CrLf + + @Indent + @Indent + N'EXECUTE (@SQL);' + @CrLf + + @Indent + N'END;' + @CrLf + N'END;' + @CrLf + @GO; DECLARE SequenceList CURSOR FAST_FORWARD READ_ONLY FOR - SELECT t.SchemaName, t.TableName, c.ColumnName, c.DefaultSequenceName + SELECT t.SchemaName, t.TableName, c.ColumnName, c.DefaultSequenceName FROM Metadata.[Columns] AS c INNER JOIN Metadata.[Tables] AS t ON c.TableName = t.TableName @@ -504,8 +513,8 @@ BEGIN SET @SQL += N'CREATE PROCEDURE Sequences.ReseedAllSequences' + @CrLf + N'AS BEGIN' + @CrLf - + @Indent + N'-- Ensures that the next sequence values are above the maximum value of the related table columns' + @CrLf - + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf; + + @Indent + N'-- Ensures that the next sequence values are above the maximum value of the related table columns' + @CrLf + + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf; OPEN SequenceList; FETCH NEXT FROM SequenceList INTO @SchemaName, @TableName, @ColumnName, @DefaultSequenceName; @@ -528,21 +537,21 @@ END; -- of setting appropriate next values for sequences SET @SQL += N'CREATE PROCEDURE DataLoadSimulation.DeactivateTemporalTablesBeforeDataLoad' + @CrLf + N'AS BEGIN' + @CrLf - + @Indent + N'-- Disables the temporal nature of the temporal tables before a simulated data load' + @CrLf - + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf; + + @Indent + N'-- Disables the temporal nature of the temporal tables before a simulated data load' + @CrLf + + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf; -SET @SQL += @Indent + N'IF EXISTS (SELECT 1 FROM sys.procedures WHERE name = N''Configuration_RemoveRowLevelSecurity'')' + @CrLf - + @Indent + N'BEGIN' + @CrLf - + @Indent + @Indent + N'EXEC [Application].Configuration_RemoveRowLevelSecurity;' + @CrLf +SET @SQL += @Indent + N'IF EXISTS (SELECT 1 FROM sys.procedures WHERE name = N''Configuration_RemoveRowLevelSecurity'')' + @CrLf + + @Indent + N'BEGIN' + @CrLf + + @Indent + @Indent + N'EXEC [Application].Configuration_RemoveRowLevelSecurity;' + @CrLf + @Indent + N'END;' + @CrLf + @CrLf; SET @SQL += @Indent + N'DECLARE @SQL nvarchar(max) = N'''';' + @CrLf - + @Indent + N'DECLARE @CrLf nvarchar(2) = NCHAR(13) + NCHAR(10);' + @CrLf + + @Indent + N'DECLARE @CrLf nvarchar(2) = NCHAR(13) + NCHAR(10);' + @CrLf + @Indent + N'DECLARE @Indent nvarchar(4) = N'' '';' + @CrLf - + @Indent + N'DECLARE @SchemaName sysname;' + @CrLf + + @Indent + N'DECLARE @SchemaName sysname;' + @CrLf + @Indent + N'DECLARE @TableName sysname;' + @CrLf - + @Indent + N'DECLARE @NormalColumnList nvarchar(max);' + @CrLf - + @Indent + N'DECLARE @NormalColumnListWithDPrefix nvarchar(max);' + @CrLf + + @Indent + N'DECLARE @NormalColumnList nvarchar(max);' + @CrLf + + @Indent + N'DECLARE @NormalColumnListWithDPrefix nvarchar(max);' + @CrLf + @Indent + N'DECLARE @PrimaryKeyColumn sysname;' + @CrLf + @Indent + N'DECLARE @TemporalFromColumnName sysname = N''' + @TemporalFromColumnName + N''';' + @CrLf + @Indent + N'DECLARE @TemporalToColumnName sysname = N''' + @TemporalToColumnName + N''';' + @CrLf @@ -551,7 +560,7 @@ SET @SQL += @Indent + N'DECLARE @SQL nvarchar(max) = N'''';' + @CrLf DECLARE TableList CURSOR FAST_FORWARD READ_ONLY FOR -SELECT SchemaName, TableName, IncludeModificationTrackingColumns +SELECT SchemaName, TableName, IncludeModificationTrackingColumns FROM Metadata.[Tables] AS t WHERE IncludeTemporalColumns <> 0 ORDER BY SchemaName, TableName; @@ -561,9 +570,9 @@ FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeModificationTrac WHILE @@FETCH_STATUS = 0 BEGIN - SET @SQL += @Indent + N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' - + QUOTENAME(@TableName) + N' SET (SYSTEM_VERSIONING = OFF);' + @CrLf - + @Indent + N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + SET @SQL += @Indent + N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + + QUOTENAME(@TableName) + N' SET (SYSTEM_VERSIONING = OFF);' + @CrLf + + @Indent + N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + N' DROP PERIOD FOR SYSTEM_TIME;' + @CrLf + @CrLf; FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeModificationTrackingColumns; END; @@ -575,7 +584,7 @@ FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeModificationTrac WHILE @@FETCH_STATUS = 0 BEGIN - + DECLARE ColumnList CURSOR FAST_FORWARD READ_ONLY FOR SELECT c.ColumnName, c.IsPrimaryKeyColumn @@ -588,7 +597,7 @@ BEGIN OPEN ColumnList; FETCH NEXT FROM ColumnList INTO @ColumnName, @IsPrimaryKeyColumn; - + WHILE @@FETCH_STATUS = 0 BEGIN IF @IsPrimaryKeyColumn <> 0 SET @PrimaryKeyColumn = @ColumnName; @@ -601,43 +610,43 @@ BEGIN DEALLOCATE ColumnList; SET @SQL += @Indent + N'SET @SQL = N'''';' + @CrLf - + @Indent + N'SET @SchemaName = N''' + @SchemaName + N''';' + @CrLf + + @Indent + N'SET @SchemaName = N''' + @SchemaName + N''';' + @CrLf + @Indent + N'SET @TableName = N''' + @TableName + N''';' + @CrLf + @Indent + N'SET @PrimaryKeyColumn = N''' + @PrimaryKeyColumn + N''';' + @CrLf + @Indent + N'SET @LastEditedByColumnName = N''' + CASE WHEN @IncludeModificationTrackingColumns <> 0 THEN @LastEditedByColumnName ELSE N'' END + N''';' + @CrLf - + @Indent + N'SET @NormalColumnList = N''' + @NormalColumnList + N''';' + @CrLf + + @Indent + N'SET @NormalColumnList = N''' + @NormalColumnList + N''';' + @CrLf + @Indent + N'SET @NormalColumnListWithDPrefix = N''' + @NormalColumnListWithDPrefix + N''';' + @CrLf + @CrLf; - SET @SQL += @Indent + N'SET @SQL = N''DROP TRIGGER IF EXISTS '' + QUOTENAME(@SchemaName)' - + N' + N''.[TR_'' + @SchemaName + N''_'' + @TableName + N''_DataLoad_Modify];''' + @CrLf + SET @SQL += @Indent + N'SET @SQL = N''DROP TRIGGER IF EXISTS '' + QUOTENAME(@SchemaName)' + + N' + N''.[TR_'' + @SchemaName + N''_'' + @TableName + N''_DataLoad_Modify];''' + @CrLf + @Indent + N'EXECUTE (@SQL);' + @CrLf + @CrLf + @Indent + N'SET @SQL = N''CREATE TRIGGER '' + QUOTENAME(@SchemaName) + N''.[TR_'' + @SchemaName + N''_'' + @TableName + N''_DataLoad_Modify]'' + @CrLf - + N''ON '' + QUOTENAME(@SchemaName) + N''.'' + QUOTENAME(@TableName) + @CrLf - + N''AFTER INSERT, UPDATE'' + @CrLf + + N''ON '' + QUOTENAME(@SchemaName) + N''.'' + QUOTENAME(@TableName) + @CrLf + + N''AFTER INSERT, UPDATE'' + @CrLf + N''AS'' + @CrLf - + N''BEGIN'' + @CrLf - + @Indent + N''SET NOCOUNT ON;'' + @CrLf + @CrLf - + @Indent + N''IF NOT UPDATE('' + QUOTENAME(@TemporalFromColumnName) + N'')'' + @CrLf - + @Indent + N''BEGIN'' + @CrLf - + @Indent + @Indent + N''THROW 51000, '''''' + QUOTENAME(@TemporalFromColumnName) - + N'' must be updated when simulating data loads'''', 1;'' + @CrLf - + @Indent + @Indent + N''ROLLBACK TRAN;'' + @CrLf - + @Indent + N''END;'' + @Crlf + @CrLf - + @Indent + N''INSERT '' + QUOTENAME(@SchemaName) + N''.'' + QUOTENAME(@TableName + N''_'' + @TemporalTableSuffix) + @CrLf + + N''BEGIN'' + @CrLf + + @Indent + N''SET NOCOUNT ON;'' + @CrLf + @CrLf + + @Indent + N''IF NOT UPDATE('' + QUOTENAME(@TemporalFromColumnName) + N'')'' + @CrLf + + @Indent + N''BEGIN'' + @CrLf + + @Indent + @Indent + N''THROW 51000, '''''' + QUOTENAME(@TemporalFromColumnName) + + N'' must be updated when simulating data loads'''', 1;'' + @CrLf + + @Indent + @Indent + N''ROLLBACK TRAN;'' + @CrLf + + @Indent + N''END;'' + @Crlf + @CrLf + + @Indent + N''INSERT '' + QUOTENAME(@SchemaName) + N''.'' + QUOTENAME(@TableName + N''_'' + @TemporalTableSuffix) + @CrLf + @Indent + @Indent + N''('' + @NormalColumnList + CASE WHEN COALESCE(@LastEditedByColumnName, N'''') <> N'''' THEN QUOTENAME(@LastEditedByColumnName) + N'', '' ELSE N'''' END - + QUOTENAME(@TemporalFromColumnName) + N'','' + QUOTENAME(@TemporalToColumnName) + N'')'' + @CrLf + + QUOTENAME(@TemporalFromColumnName) + N'','' + QUOTENAME(@TemporalToColumnName) + N'')'' + @CrLf + @Indent + N''SELECT'' + @NormalColumnListWithDPrefix + CASE WHEN COALESCE(@LastEditedByColumnName, N'''') <> N'''' THEN N''d.'' + QUOTENAME(@LastEditedByColumnName) + N'', '' ELSE N'''' END + N'' d.'' + QUOTENAME(@TemporalFromColumnName) + N'', i.'' + QUOTENAME(@TemporalFromColumnName) + @CrLf + @Indent + N''FROM inserted AS i'' + @CrLf - + @Indent + N''INNER JOIN deleted AS d'' + @CrLf - + @Indent + N''ON i.'' + QUOTENAME(@PrimaryKeyColumn) + N'' = d.'' + QUOTENAME(@PrimaryKeyColumn) + N'';'' + @CrLf - + N''END;'';' + @CrLf - + @Indent + N'IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = @TableName AND is_memory_optimized <> 0)' + @CrLf - + @Indent + N'BEGIN' + @CrLf - + @Indent + N' EXECUTE (@SQL);' + @CrLf + + @Indent + N''INNER JOIN deleted AS d'' + @CrLf + + @Indent + N''ON i.'' + QUOTENAME(@PrimaryKeyColumn) + N'' = d.'' + QUOTENAME(@PrimaryKeyColumn) + N'';'' + @CrLf + + N''END;'';' + @CrLf + + @Indent + N'IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = @TableName AND is_memory_optimized <> 0)' + @CrLf + + @Indent + N'BEGIN' + @CrLf + + @Indent + N' EXECUTE (@SQL);' + @CrLf + @Indent + N'END;' + @CrLf + @CrLf; FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeModificationTrackingColumns; END; @@ -652,17 +661,17 @@ SET @SQL += N'END;' + @CrLf + @GO; SET @SQL += N'CREATE PROCEDURE DataLoadSimulation.ReactivateTemporalTablesAfterDataLoad' + @CrLf + N'AS BEGIN' + @CrLf - + @Indent + N'-- Re-enables the temporal nature of the temporal tables after a simulated data load' + @CrLf - + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf; + + @Indent + N'-- Re-enables the temporal nature of the temporal tables after a simulated data load' + @CrLf + + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf; -SET @SQL += @Indent + N'IF EXISTS (SELECT 1 FROM sys.procedures WHERE name = N''Configuration_ApplyRowLevelSecurity'')' + @CrLf - + @Indent + N'BEGIN' + @CrLf - + @Indent + @Indent + N'EXEC [Application].Configuration_ApplyRowLevelSecurity;' + @CrLf +SET @SQL += @Indent + N'IF EXISTS (SELECT 1 FROM sys.procedures WHERE name = N''Configuration_ApplyRowLevelSecurity'')' + @CrLf + + @Indent + N'BEGIN' + @CrLf + + @Indent + @Indent + N'EXEC [Application].Configuration_ApplyRowLevelSecurity;' + @CrLf + @Indent + N'END;' + @CrLf + @CrLf; DECLARE TableList CURSOR FAST_FORWARD READ_ONLY FOR -SELECT SchemaName, TableName +SELECT SchemaName, TableName FROM Metadata.[Tables] WHERE IncludeTemporalColumns <> 0 ORDER BY SchemaName, TableName; @@ -672,14 +681,14 @@ FETCH NEXT FROM TableList INTO @SchemaName, @TableName; WHILE @@FETCH_STATUS = 0 BEGIN - SET @SQL += @Indent + N'DROP TRIGGER IF EXISTS ' + QUOTENAME(@SchemaName) + SET @SQL += @Indent + N'DROP TRIGGER IF EXISTS ' + QUOTENAME(@SchemaName) + N'.[TR_' + @SchemaName + N'_' + @TableName + N'_DataLoad_Modify];' + @CrLf - + @Indent + N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) - + N' ADD PERIOD FOR SYSTEM_TIME(' + QUOTENAME(@TemporalFromColumnName) + N', ' + + @Indent + N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + + N' ADD PERIOD FOR SYSTEM_TIME(' + QUOTENAME(@TemporalFromColumnName) + N', ' + QUOTENAME(@TemporalToColumnName) + N');' + @CrLf - + @Indent + N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + + @Indent + N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + N' SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = ' + QUOTENAME(@SchemaName) - + N'.' + QUOTENAME(@TableName + N'_' + @TemporalTableSuffix) + + N'.' + QUOTENAME(@TableName + N'_' + @TemporalTableSuffix) + N', DATA_CONSISTENCY_CHECK = ON));' + @CrLf + @CrLf; FETCH NEXT FROM TableList INTO @SchemaName, @TableName; END; diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql index 2cb59ecd..1007f228 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql @@ -9,7 +9,7 @@ GO CREATE PROCEDURE [Application].CreateRoleIfNonexistent @RoleName sysname -WITH EXECUTE AS OWNER +WITH EXECUTE AS OWNER AS BEGIN SET NOCOUNT ON; @@ -18,9 +18,9 @@ BEGIN IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = @RoleName AND type = N'R') BEGIN BEGIN TRY - + DECLARE @SQL nvarchar(max) = N'CREATE ROLE ' + QUOTENAME(@RoleName) + N';' - EXECUTE (@SQL); + EXECUTE (@SQL); PRINT N'Role ' + @RoleName + N' created'; @@ -39,27 +39,27 @@ GO CREATE PROCEDURE [Application].AddRoleMemberIfNonexistent @RoleName sysname, @UserName sysname -WITH EXECUTE AS OWNER +WITH EXECUTE AS OWNER AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - IF NOT EXISTS (SELECT 1 FROM sys.database_role_members AS drm - INNER JOIN sys.database_principals AS dpr + IF NOT EXISTS (SELECT 1 FROM sys.database_role_members AS drm + INNER JOIN sys.database_principals AS dpr ON drm.role_principal_id = dpr.principal_id AND dpr.type = N'R' INNER JOIN sys.database_principals AS dpu ON drm.member_principal_id = dpu.principal_id AND dpu.type = N'S' - WHERE dpr.name = @RoleName + WHERE dpr.name = @RoleName AND dpu.name = @UserName) BEGIN BEGIN TRY - - DECLARE @SQL nvarchar(max) = N'ALTER ROLE ' + QUOTENAME(@RoleName) + + DECLARE @SQL nvarchar(max) = N'ALTER ROLE ' + QUOTENAME(@RoleName) + N' ADD MEMBER ' + QUOTENAME(@UserName) + N';' - EXECUTE (@SQL); + EXECUTE (@SQL); PRINT N'User ' + @UserName + N' added to role ' + @RoleName; @@ -92,8 +92,8 @@ CREATE PROCEDURE Website.SearchForPeople AS BEGIN SELECT TOP(@MaximumRowsToReturn) - p.PersonID, - p.FullName, + p.PersonID, + p.FullName, p.PreferredName, CASE WHEN p.IsSalesperson <> 0 THEN N'Salesperson' WHEN p.IsEmployee <> 0 THEN N'Employee' @@ -104,11 +104,11 @@ BEGIN COALESCE(c.CustomerName, sp.SupplierName, sa.SupplierName, N'WWI') AS Company FROM [Application].People AS p LEFT OUTER JOIN Sales.Customers AS c - ON c.PrimaryContactPersonID = p.PersonID + ON c.PrimaryContactPersonID = p.PersonID LEFT OUTER JOIN Purchasing.Suppliers AS sp - ON sp.PrimaryContactPersonID = p.PersonID + ON sp.PrimaryContactPersonID = p.PersonID LEFT OUTER JOIN Purchasing.Suppliers AS sa - ON sa.AlternateContactPersonID = p.PersonID + ON sa.AlternateContactPersonID = p.PersonID WHERE p.SearchName LIKE N'%' + @SearchText + N'%' ORDER BY p.FullName FOR JSON AUTO, ROOT(N'People'); @@ -133,17 +133,17 @@ AS BEGIN SELECT TOP(@MaximumRowsToReturn) s.SupplierID, - s.SupplierName, - c.CityName, - s.PhoneNumber, + s.SupplierName, + c.CityName, + s.PhoneNumber, s.FaxNumber , p.FullName AS PrimaryContactFullName, p.PreferredName AS PrimaryContactPreferredName FROM Purchasing.Suppliers AS s INNER JOIN [Application].Cities AS c - ON s.DeliveryCityID = c.CityID + ON s.DeliveryCityID = c.CityID LEFT OUTER JOIN [Application].People AS p - ON s.PrimaryContactPersonID = p.PersonID + ON s.PrimaryContactPersonID = p.PersonID WHERE CONCAT(s.SupplierName, N' ', p.FullName, N' ', p.PreferredName) LIKE N'%' + @SearchText + N'%' ORDER BY s.SupplierName FOR JSON AUTO, ROOT(N'Suppliers'); @@ -166,18 +166,18 @@ WITH EXECUTE AS OWNER AS BEGIN SELECT TOP(@MaximumRowsToReturn) - c.CustomerID, - c.CustomerName, - ct.CityName, - c.PhoneNumber, - c.FaxNumber, + c.CustomerID, + c.CustomerName, + ct.CityName, + c.PhoneNumber, + c.FaxNumber, p.FullName AS PrimaryContactFullName, p.PreferredName AS PrimaryContactPreferredName FROM Sales.Customers AS c INNER JOIN [Application].Cities AS ct - ON c.DeliveryCityID = ct.CityID + ON c.DeliveryCityID = ct.CityID LEFT OUTER JOIN [Application].People AS p - ON c.PrimaryContactPersonID = p.PersonID + ON c.PrimaryContactPersonID = p.PersonID WHERE CONCAT(c.CustomerName, N' ', p.FullName, N' ', p.PreferredName) LIKE N'%' + @SearchText + N'%' ORDER BY c.CustomerName FOR JSON AUTO, ROOT(N'Customers'); @@ -200,7 +200,7 @@ WITH EXECUTE AS OWNER AS BEGIN SELECT TOP(@MaximumRowsToReturn) - si.StockItemID, + si.StockItemID, si.StockItemName FROM Warehouse.StockItems AS si WHERE si.SearchDetails LIKE N'%' + @SearchText + N'%' @@ -226,7 +226,7 @@ WITH EXECUTE AS OWNER AS BEGIN SELECT TOP(@MaximumRowsToReturn) - si.StockItemID, + si.StockItemID, si.StockItemName FROM Warehouse.StockItems AS si WHERE si.Tags LIKE N'%' + @SearchText + N'%' @@ -259,7 +259,7 @@ BEGIN + N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":2,"when":"2016-01-01T07:00:00","temp":3.98}}' + @CrLf + N' ]' + @CrLf + N'}'; - + IF ISJSON(@FullSensorDataArray) = 0 BEGIN PRINT @HelpMessage; @@ -268,14 +268,14 @@ BEGIN END; BEGIN TRY - + BEGIN TRAN; INSERT Warehouse.VehicleTemperatures - (VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature, + (VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature, FullSensorData, IsCompressed, CompressedSensorData) - SELECT VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature, - FullSensorData, 0, NULL + SELECT VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature, + FullSensorData, 0, NULL FROM OPENJSON(@FullSensorDataArray, N'$.Recordings') WITH ( VehicleRegistration nvarchar(40) N'$.properties.rego', ChillerSensorNumber int N'$.properties.sensor', @@ -294,9 +294,9 @@ BEGIN END TRY BEGIN CATCH PRINT @HelpMessage; - + THROW 51000, N'Valid JSON was supplied but does not match the temperature recordings array structure', 2; - + IF XACT_STATE() <> 0 ROLLBACK TRAN; RETURN 1; @@ -304,14 +304,14 @@ BEGIN END; GO -/* +/* -- should succeed DECLARE @Recordings nvarchar(max) = N'{"Recordings": ' - + N' [' - + N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":1,"when":"2016-01-01T07:00:00","temp":3.96}},' - + N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":2,"when":"2016-01-01T07:00:00","temp":3.98}}' + + N' [' + + N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":1,"when":"2016-01-01T07:00:00","temp":3.96}},' + + N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":2,"when":"2016-01-01T07:00:00","temp":3.98}}' + N' ]' + N'}'; EXEC Website.RecordVehicleTemperature @Recordings; @@ -324,9 +324,9 @@ EXEC Website.RecordVehicleTemperature @Recordings; -- should get error and help message DECLARE @Recordings nvarchar(max) = N'{"Recordings": ' - + N' [' - + N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":1,"when":"NOT A DATE","temp":3.96}},' - + N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":2,"when":"NOT A DATE","temp":3.98}}' + + N' [' + + N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":1,"when":"NOT A DATE","temp":3.96}},' + + N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":2,"when":"NOT A DATE","temp":3.98}}' + N' ]' + N'}'; EXEC Website.RecordVehicleTemperature @Recordings; @@ -340,7 +340,7 @@ DROP PROCEDURE IF EXISTS DataLoadSimulation.Configuration_ApplyDataLoadSimulatio GO CREATE PROCEDURE DataLoadSimulation.Configuration_ApplyDataLoadSimulationProcedures -WITH EXECUTE AS OWNER +WITH EXECUTE AS OWNER AS BEGIN SET NOCOUNT ON; @@ -350,7 +350,7 @@ BEGIN DECLARE @SQL nvarchar(max); - IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE name = N'GetAreaCode' + IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE name = N'GetAreaCode' AND type = N'FN' AND SCHEMA_NAME(schema_id) = N'DataLoadSimulation') BEGIN @@ -363,13 +363,13 @@ RETURNS INT WITH EXECUTE AS OWNER AS BEGIN - DECLARE @AreaCode int; + DECLARE @AreaCode int; WITH AreaCodes AS ( - SELECT StateProvinceCode, AreaCode - FROM + SELECT StateProvinceCode, AreaCode + FROM (VALUES (''NJ'', 201), (''DC'', 202), (''CT'', 203), @@ -740,12 +740,12 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.ActivateWebsiteLogons -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -753,7 +753,7 @@ BEGIN -- Approximately 1 in 8 days has a new website activation DECLARE @NumberOfLogonsToActivate int = CASE WHEN (RAND() * 8) <= 1 THEN 1 ELSE 0 END; - + IF @IsSilentMode = 0 BEGIN PRINT N''Activating '' + CAST(@NumberOfLogonsToActivate AS nvarchar(20)) + N'' logons''; @@ -770,48 +770,48 @@ BEGIN BEGIN SELECT TOP(1) @PersonID = PersonID, @EmailAddress = EmailAddress, - @FullName = FullName - FROM [Application].People + @FullName = FullName + FROM [Application].People WHERE IsPermittedToLogon = 0 AND PersonID <> 1 ORDER BY NEWID(); - - UPDATE [Application].People + + UPDATE [Application].People SET IsPermittedToLogon = 1, LogonName = @EmailAddress, HashedPassword = HASHBYTES(N''SHA2_256'', N''SQLRocks!00'' + @FullName), UserPreferences = @UserPreferences, - [ValidFrom] = @StartingWhen + [ValidFrom] = @StartingWhen WHERE PersonID = @PersonID; - + SET @Counter += 1; END; END;'; EXECUTE (@SQL); END; - + IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation' AND name = N'AddCustomers') BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.AddCustomers -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit WITH EXECUTE AS OWNER -AS +AS BEGIN - + SET NOCOUNT ON; SET XACT_ABORT ON; -- add a customer one in 15 days average - DECLARE @NumberOfCustomersToAdd int = (SELECT TOP(1) Quantity - FROM (VALUES (0), (0), (0), (0), (0), + DECLARE @NumberOfCustomersToAdd int = (SELECT TOP(1) Quantity + FROM (VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), (0), - (0), (0), (0), (0), (1)) AS q(Quantity) + (0), (0), (0), (0), (1)) AS q(Quantity) ORDER BY NEWID()); IF @IsSilentMode = 0 BEGIN @@ -825,13 +825,13 @@ BEGIN DECLARE @CityStateProvinceCode nvarchar(5); DECLARE @AreaCode int; DECLARE @CustomerCategoryID int; - - + + DECLARE @CustomerID int; DECLARE @PrimaryContactFullName nvarchar(50); DECLARE @PrimaryContactPersonID int; DECLARE @PrimaryContactFirstName nvarchar(50); - DECLARE @DeliveryMethodID int = (SELECT DeliveryMethodID FROM [Application].DeliveryMethods + DECLARE @DeliveryMethodID int = (SELECT DeliveryMethodID FROM [Application].DeliveryMethods WHERE DeliveryMethodName = N''Delivery Van''); DECLARE @DeliveryAddressLine1 nvarchar(max); DECLARE @DeliveryAddressLine2 nvarchar(max); @@ -1127,39 +1127,39 @@ BEGIN UnusedNames AS ( - SELECT * + SELECT * FROM NamesToUse AS ntu WHERE NOT EXISTS (SELECT 1 FROM [Application].People AS p WHERE p.FullName = ntu.FullName) ) SELECT TOP(1) @PrimaryContactFullName = un.FullName, - @PrimaryContactFirstName = un.FirstName + @PrimaryContactFirstName = un.FirstName FROM UnusedNames AS un ORDER BY NEWID(); SET @CustomerID = NEXT VALUE FOR Sequences.CustomerID; - SET @CustomerCategoryID = (SELECT TOP(1) CustomerCategoryID - FROM Sales.CustomerCategories + SET @CustomerCategoryID = (SELECT TOP(1) CustomerCategoryID + FROM Sales.CustomerCategories WHERE CustomerCategoryName IN (N''Novelty Shop'', N''Supermarket'', N''Computer Store'', N''Gift Store'', N''Corporate'') ORDER BY NEWID()); SET @CityID = (SELECT TOP(1) CityID FROM [Application].Cities AS c ORDER BY NEWID()); SET @CityName = (SELECT CityName FROM [Application].Cities WHERE CityID = @CityID); SET @CityStateProvinceID = (SELECT StateProvinceID FROM [Application].Cities WHERE CityID = @CityID); - SET @CityStateProvinceCode = (SELECT StateProvinceCode - FROM [Application].StateProvinces + SET @CityStateProvinceCode = (SELECT StateProvinceCode + FROM [Application].StateProvinces WHERE StateProvinceID = @CityStateProvinceID); SET @AreaCode = DataLoadSimulation.GetAreaCode(@CityStateProvinceCode); - SET @StreetSuffix = (SELECT TOP(1) StreetType + SET @StreetSuffix = (SELECT TOP(1) StreetType FROM (VALUES(N''Street''), (N''Lane''), (N''Avenue''), (N''Boulevard''), (N''Crescent''), (N''Road'')) AS st(StreetType) ORDER BY NEWID()); - SET @CompanySuffix = (SELECT TOP(1) CompanySuffix + SET @CompanySuffix = (SELECT TOP(1) CompanySuffix FROM (VALUES(N''Inc''), (N''Corp''), (N''LLC'')) AS cs(CompanySuffix) ORDER BY NEWID()); - SET @StorePrefix = (SELECT TOP(1) StorePrefix + SET @StorePrefix = (SELECT TOP(1) StorePrefix FROM (VALUES(N''Shop''), (N''Suite''), (N''Unit'')) AS sp(StorePrefix) ORDER BY NEWID()); SET @CreditLimit = CEILING(RAND() * 30) * 100 + 1000; - + SET @DeliveryAddressLine1 = @StorePrefix + N'' '' + CAST(CEILING(RAND() * 30) + 1 AS nvarchar(20)); SET @DeliveryAddressLine2 = CAST(CEILING(RAND() * 2000) + 1 AS nvarchar(20)) + N'' '' + (SELECT TOP(1) PreferredName FROM [Application].People ORDER BY NEWID()) @@ -1168,29 +1168,29 @@ BEGIN SET @PostalAddressLine1 = N''PO Box '' + CAST(CEILING(RAND() * 10000) + 10 AS nvarchar(20)); SET @PostalAddressLine2 = (SELECT TOP(1) PreferredName FROM [Application].People ORDER BY NEWID()) + N''ville''; SET @PostalPostalCode = @DeliveryPostalCode; - + SET @PrimaryContactPersonID = NEXT VALUE FOR Sequences.PersonID; - + BEGIN TRAN; INSERT [Application].People - (PersonID, FullName, PreferredName, IsPermittedToLogon, LogonName, - IsExternalLogonProvider, HashedPassword, IsSystemUser, IsEmployee, - IsSalesperson, UserPreferences, PhoneNumber, FaxNumber, + (PersonID, FullName, PreferredName, IsPermittedToLogon, LogonName, + IsExternalLogonProvider, HashedPassword, IsSystemUser, IsEmployee, + IsSalesperson, UserPreferences, PhoneNumber, FaxNumber, EmailAddress, LastEditedBy, ValidFrom, ValidTo) VALUES (@PrimaryContactPersonID, @PrimaryContactFullName, @PrimaryContactFirstName, 0, N''NO LOGON'', - 0, NULL, 0, 0, + 0, NULL, 0, 0, 0, NULL, N''('' + CAST(@AreaCode AS nvarchar(20)) + N'') 555-0100'', N''('' + CAST(@AreaCode AS nvarchar(20)) + N'') 555-0101'', LOWER(REPLACE(@PrimaryContactFirstName, N'''''''', N'''')) + N''@example.com'', 1, @CurrentDateTime, @EndOfTime); - + INSERT Sales.Customers - (CustomerID, CustomerName, BillToCustomerID, CustomerCategoryID, - BuyingGroupID, PrimaryContactPersonID, AlternateContactPersonID, DeliveryMethodID, - DeliveryCityID, PostalCityID, CreditLimit, AccountOpenedDate, StandardDiscountPercentage, - IsStatementSent, IsOnCreditHold, PaymentDays, PhoneNumber, FaxNumber, - DeliveryRun, RunPosition, WebsiteURL, DeliveryAddressLine1, DeliveryAddressLine2, - DeliveryPostalCode, DeliveryLocation, PostalAddressLine1, PostalAddressLine2, + (CustomerID, CustomerName, BillToCustomerID, CustomerCategoryID, + BuyingGroupID, PrimaryContactPersonID, AlternateContactPersonID, DeliveryMethodID, + DeliveryCityID, PostalCityID, CreditLimit, AccountOpenedDate, StandardDiscountPercentage, + IsStatementSent, IsOnCreditHold, PaymentDays, PhoneNumber, FaxNumber, + DeliveryRun, RunPosition, WebsiteURL, DeliveryAddressLine1, DeliveryAddressLine2, + DeliveryPostalCode, DeliveryLocation, PostalAddressLine1, PostalAddressLine2, PostalPostalCode, LastEditedBy, ValidFrom, ValidTo) VALUES (@CustomerID, @PrimaryContactFullName, @CustomerID, @CustomerCategoryID, @@ -1215,13 +1215,13 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.AddSpecialDeals -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit -AS +AS BEGIN - + SET NOCOUNT ON; SET XACT_ABORT ON; @@ -1229,22 +1229,22 @@ BEGIN BEGIN BEGIN TRAN; - INSERT Sales.SpecialDeals - (StockItemID, CustomerID, BuyingGroupID, CustomerCategoryID, StockGroupID, - DealDescription, StartDate, EndDate, DiscountAmount, DiscountPercentage, + INSERT Sales.SpecialDeals + (StockItemID, CustomerID, BuyingGroupID, CustomerCategoryID, StockGroupID, + DealDescription, StartDate, EndDate, DiscountAmount, DiscountPercentage, UnitPrice, LastEditedBy, LastEditedWhen) VALUES - (NULL, NULL, (SELECT BuyingGroupID FROM Sales.BuyingGroups WHERE BuyingGroupName = N''Wingtip Toys''), + (NULL, NULL, (SELECT BuyingGroupID FROM Sales.BuyingGroups WHERE BuyingGroupName = N''Wingtip Toys''), NULL, (SELECT StockGroupID FROM Warehouse.StockGroups WHERE StockGroupName = N''USB Novelties''), N''10% 1st qtr USB Wingtip'', ''20160101'', ''20160331'', NULL, 10, NULL, 2, @StartingWhen); - INSERT Sales.SpecialDeals - (StockItemID, CustomerID, BuyingGroupID, CustomerCategoryID, StockGroupID, - DealDescription, StartDate, EndDate, DiscountAmount, DiscountPercentage, + INSERT Sales.SpecialDeals + (StockItemID, CustomerID, BuyingGroupID, CustomerCategoryID, StockGroupID, + DealDescription, StartDate, EndDate, DiscountAmount, DiscountPercentage, UnitPrice, LastEditedBy, LastEditedWhen) VALUES - (NULL, NULL, (SELECT BuyingGroupID FROM Sales.BuyingGroups WHERE BuyingGroupName = N''Tailspin Toys''), + (NULL, NULL, (SELECT BuyingGroupID FROM Sales.BuyingGroups WHERE BuyingGroupName = N''Tailspin Toys''), NULL, (SELECT StockGroupID FROM Warehouse.StockGroups WHERE StockGroupName = N''USB Novelties''), N''15% 2nd qtr USB Tailspin'', ''20160401'', ''20160630'', NULL, 15, NULL, 2, @StartingWhen); @@ -1267,13 +1267,13 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.AddStockItems -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit -AS +AS BEGIN - + SET NOCOUNT ON; SET XACT_ABORT ON; @@ -1299,7 +1299,7 @@ BEGIN SET @NumberOfStockItems = 2; BEGIN TRAN; - + INSERT Warehouse.StockItems (StockItemID, StockItemName, SupplierID, ColorID, UnitPackageID, OuterPackageID, Brand, Size, LeadTimeDays, QuantityPerOuter, IsChillerStock, Barcode, TaxRate, UnitPrice, RecommendedRetailPrice, TypicalWeightPerUnit, MarketingComments, InternalComments, Photo, CustomFields, LastEditedBy, ValidFrom, ValidTo) VALUES (222,''Chocolate beetles 250g'',(SELECT SupplierID FROM Purchasing.Suppliers WHERE SupplierName = N''A Datum Corporation''),(SELECT ColorID FROM Warehouse.Colors WHERE ColorName = N''NULL''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Bag''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Carton''),NULL,''250g'',3,24,1,''8792838293820'',10,8.55,12.23,0.25,''Perfect for your child''''s party'',NULL,NULL,NULL,1,@CurrentDateTime,@EndOfTime); INSERT Warehouse.StockItems (StockItemID, StockItemName, SupplierID, ColorID, UnitPackageID, OuterPackageID, Brand, Size, LeadTimeDays, QuantityPerOuter, IsChillerStock, Barcode, TaxRate, UnitPrice, RecommendedRetailPrice, TypicalWeightPerUnit, MarketingComments, InternalComments, Photo, CustomFields, LastEditedBy, ValidFrom, ValidTo) VALUES (223,''Chocolate echidnas 250g'',(SELECT SupplierID FROM Purchasing.Suppliers WHERE SupplierName = N''A Datum Corporation''),(SELECT ColorID FROM Warehouse.Colors WHERE ColorName = N''NULL''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Bag''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Carton''),NULL,''250g'',3,24,1,''8792838293728'',10,8.55,12.23,0.25,''Perfect for your child''''s party'',NULL,NULL,NULL,1,@CurrentDateTime,@EndOfTime); INSERT Warehouse.StockItemHoldings (StockItemID, QuantityOnHand, BinLocation, LastStocktakeQuantity, LastCostPrice, ReorderLevel, TargetStockLevel, LastEditedBy, LastEditedWhen) VALUES (222,120,''CH-3'',120,4.75,240,500,1,@CurrentDateTime); @@ -1354,20 +1354,20 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.ChangePasswords -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; -- 1 in 4 days will be 1 password change, 1 in 8 days will be 2 passwords changed - DECLARE @NumberOfPasswordsToChange int = (SELECT TOP(1) Quantity - FROM (VALUES (0), (0), (0), (0), (0), (1), (1), (2)) AS q(Quantity) + DECLARE @NumberOfPasswordsToChange int = (SELECT TOP(1) Quantity + FROM (VALUES (0), (0), (0), (0), (0), (1), (1), (2)) AS q(Quantity) ORDER BY NEWID()); IF @IsSilentMode = 0 BEGIN @@ -1384,16 +1384,16 @@ BEGIN BEGIN SELECT TOP(1) @PersonID = PersonID, @EmailAddress = EmailAddress, - @FullName = FullName - FROM [Application].People + @FullName = FullName + FROM [Application].People WHERE IsPermittedToLogon <> 0 AND PersonID <> 1 ORDER BY NEWID(); - - UPDATE [Application].People + + UPDATE [Application].People SET HashedPassword = HASHBYTES(N''SHA2_256'', N''SQLRocks!00'' + @FullName), - [ValidFrom] = @StartingWhen + [ValidFrom] = @StartingWhen WHERE PersonID = @PersonID; - + SET @Counter += 1; END; END;'; @@ -1405,13 +1405,13 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.CreateCustomerOrders -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @NumberOfCustomerOrders int, @IsSilentMode bit WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -1446,7 +1446,7 @@ BEGIN BEGIN SET @ExpectedDeliveryDate = DATEADD(day, 1, @ExpectedDeliveryDate); END; - + -- Generate the required orders WHILE @OrderCounter < @NumberOfCustomerOrders @@ -1462,17 +1462,17 @@ BEGIN WHERE c.IsOnCreditHold = 0 ORDER BY NEWID(); - SET @SalespersonPersonID = (SELECT TOP(1) PersonID - FROM [Application].People - WHERE IsSalesperson <> 0 + SET @SalespersonPersonID = (SELECT TOP(1) PersonID + FROM [Application].People + WHERE IsSalesperson <> 0 ORDER BY NEWID()); - INSERT Sales.Orders - (OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, OrderDate, - ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, Comments, DeliveryInstructions, InternalComments, + INSERT Sales.Orders + (OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, OrderDate, + ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, Comments, DeliveryInstructions, InternalComments, PickingCompletedWhen, LastEditedBy, LastEditedWhen) - VALUES - (@OrderID, @CustomerID, @SalespersonPersonID, NULL, @PrimaryContactPersonID, NULL, @CurrentDateTime, + VALUES + (@OrderID, @CustomerID, @SalespersonPersonID, NULL, @PrimaryContactPersonID, NULL, @CurrentDateTime, @ExpectedDeliveryDate, CAST(CEILING(RAND() * 10000) + 10000 AS nvarchar(20)), 1, NULL, NULL, NULL, NULL, 1, @OrderDateTime); @@ -1481,22 +1481,22 @@ BEGIN WHILE @OrderLineCounter < @NumberOfOrderLines BEGIN - SELECT TOP(1) @StockItemID = si.StockItemID, + SELECT TOP(1) @StockItemID = si.StockItemID, @StockItemName = si.StockItemName, @UnitPackageID = si.UnitPackageID, @QuantityPerOuter = si.QuantityPerOuter, @TaxRate = si.TaxRate FROM Warehouse.StockItems AS si - WHERE NOT EXISTS (SELECT 1 FROM Sales.OrderLines AS ol - WHERE ol.OrderID = @OrderID + WHERE NOT EXISTS (SELECT 1 FROM Sales.OrderLines AS ol + WHERE ol.OrderID = @OrderID AND ol.StockItemID = si.StockItemID) ORDER BY NEWID(); SET @Quantity = @QuantityPerOuter * (1 + FLOOR(RAND() * 10)); SET @CustomerPrice = Website.CalculateCustomerPrice(@CustomerID, @StockItemID, @CurrentDateTime); - INSERT Sales.OrderLines - (OrderID, StockItemID, [Description], PackageTypeID, Quantity, UnitPrice, + INSERT Sales.OrderLines + (OrderID, StockItemID, [Description], PackageTypeID, Quantity, UnitPrice, TaxRate, PickedQuantity, PickingCompletedWhen, LastEditedBy, LastEditedWhen) VALUES (@OrderID, @StockItemID, @StockItemName, @UnitPackageID, @Quantity, @CustomerPrice, @@ -1504,7 +1504,7 @@ BEGIN SET @OrderLineCounter += 1; END; - + COMMIT; SET @OrderCounter += 1; @@ -1518,11 +1518,11 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.InvoicePickedOrders -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -1548,17 +1548,17 @@ BEGIN DECLARE OrderList CURSOR FAST_FORWARD READ_ONLY FOR - SELECT o.OrderID, o.PickingCompletedWhen, c.BillToCustomerID + SELECT o.OrderID, o.PickingCompletedWhen, c.BillToCustomerID FROM Sales.Orders AS o INNER JOIN Sales.Customers AS c - ON o.CustomerID = c.CustomerID + ON o.CustomerID = c.CustomerID WHERE NOT EXISTS (SELECT 1 FROM Sales.Invoices AS i WHERE i.OrderID = o.OrderID) -- not already invoiced AND c.IsOnCreditHold = 0 -- and customer not on credit hold AND ((o.PickingCompletedWhen IS NOT NULL) -- order completely picked OR (o.PickingCompletedWhen IS NULL -- order not picked but customer happy AND o.IsUndersupplyBackordered <> 0 -- for part shipments and at least one AND EXISTS (SELECT 1 FROM Sales.OrderLines AS ol -- order line has been picked - WHERE ol.OrderID = o.OrderID + WHERE ol.OrderID = o.OrderID AND ol.PickingCompletedWhen IS NOT NULL))); OPEN OrderList; @@ -1575,30 +1575,30 @@ BEGIN SET @PickingCompletedWhen = @StartingWhen; -- create the backorder order - INSERT Sales.Orders - (OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, - OrderDate, ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, + INSERT Sales.Orders + (OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, + OrderDate, ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, Comments, DeliveryInstructions, InternalComments, PickingCompletedWhen, LastEditedBy, LastEditedWhen) SELECT @BackorderOrderID, o.CustomerID, o.SalespersonPersonID, NULL, o.ContactPersonID, NULL, o.OrderDate, o.ExpectedDeliveryDate, o.CustomerPurchaseOrderNumber, 1, - o.Comments, o.DeliveryInstructions, o.InternalComments, NULL, @InvoicingPersonID, @StartingWhen + o.Comments, o.DeliveryInstructions, o.InternalComments, NULL, @InvoicingPersonID, @StartingWhen FROM Sales.Orders AS o WHERE o.OrderID = @OrderID; -- move the items that haven''t been supplied to the new order - UPDATE Sales.OrderLines + UPDATE Sales.OrderLines SET OrderID = @BackorderOrderID, LastEditedBy = @InvoicingPersonID, - LastEditedWhen = @StartingWhen - WHERE OrderID = @OrderID + LastEditedWhen = @StartingWhen + WHERE OrderID = @OrderID AND PickingCompletedWhen IS NULL; -- flag the original order as backordered and picking completed - UPDATE Sales.Orders + UPDATE Sales.Orders SET BackorderOrderID = @BackorderOrderID, PickingCompletedWhen = @PickingCompletedWhen, LastEditedBy = @InvoicingPersonID, - LastEditedWhen = @StartingWhen + LastEditedWhen = @StartingWhen WHERE OrderID = @OrderID; COMMIT; @@ -1606,9 +1606,9 @@ BEGIN SELECT @TotalDryItems = SUM(CASE WHEN si.IsChillerStock <> 0 THEN 0 ELSE 1 END), @TotalChillerItems = SUM(CASE WHEN si.IsChillerStock <> 0 THEN 1 ELSE 0 END) - FROM Sales.OrderLines AS ol + FROM Sales.OrderLines AS ol INNER JOIN Warehouse.StockItems AS si - ON ol.StockItemID = si.StockItemID + ON ol.StockItemID = si.StockItemID WHERE ol.OrderID = @OrderID; -- now invoice whatever is left on the order @@ -1625,17 +1625,17 @@ BEGIN SET @ReturnedDeliveryData = JSON_MODIFY(@ReturnedDeliveryData, N''append $.Events'', JSON_QUERY(@DeliveryEvent)); - INSERT Sales.Invoices - (InvoiceID, CustomerID, BillToCustomerID, OrderID, DeliveryMethodID, ContactPersonID, AccountsPersonID, - SalespersonPersonID, PackedByPersonID, InvoiceDate, CustomerPurchaseOrderNumber, - IsCreditNote, CreditNoteReason, Comments, DeliveryInstructions, InternalComments, - TotalDryItems, TotalChillerItems, + INSERT Sales.Invoices + (InvoiceID, CustomerID, BillToCustomerID, OrderID, DeliveryMethodID, ContactPersonID, AccountsPersonID, + SalespersonPersonID, PackedByPersonID, InvoiceDate, CustomerPurchaseOrderNumber, + IsCreditNote, CreditNoteReason, Comments, DeliveryInstructions, InternalComments, + TotalDryItems, TotalChillerItems, DeliveryRun, RunPosition, ReturnedDeliveryData, LastEditedBy, LastEditedWhen) SELECT @InvoiceID, c.CustomerID, @BillToCustomerID, @OrderID, c.DeliveryMethodID, o.ContactPersonID, btc.PrimaryContactPersonID, o.SalespersonPersonID, @PackedByPersonID, @StartingWhen, o.CustomerPurchaseOrderNumber, 0, NULL, NULL, c.DeliveryAddressLine1 + N'', '' + c.DeliveryAddressLine2, NULL, - @TotalDryItems, @TotalChillerItems, - c.DeliveryRun, c.RunPosition, @ReturnedDeliveryData, @InvoicingPersonID, @StartingWhen + @TotalDryItems, @TotalChillerItems, + c.DeliveryRun, c.RunPosition, @ReturnedDeliveryData, @InvoicingPersonID, @StartingWhen FROM Sales.Orders AS o INNER JOIN Sales.Customers AS c ON o.CustomerID = c.CustomerID @@ -1643,61 +1643,61 @@ BEGIN ON btc.CustomerID = c.BillToCustomerID WHERE o.OrderID = @OrderID; - INSERT Sales.InvoiceLines - (InvoiceID, StockItemID, [Description], PackageTypeID, - Quantity, UnitPrice, TaxRate, TaxAmount, LineProfit, ExtendedPrice, + INSERT Sales.InvoiceLines + (InvoiceID, StockItemID, [Description], PackageTypeID, + Quantity, UnitPrice, TaxRate, TaxAmount, LineProfit, ExtendedPrice, LastEditedBy, LastEditedWhen) SELECT @InvoiceID, ol.StockItemID, ol.[Description], ol.PackageTypeID, - ol.PickedQuantity, ol.UnitPrice, ol.TaxRate, + ol.PickedQuantity, ol.UnitPrice, ol.TaxRate, ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2), ROUND(ol.PickedQuantity * (ol.UnitPrice - sih.LastCostPrice), 2), ROUND(ol.PickedQuantity * ol.UnitPrice, 2) + ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2), - @InvoicingPersonID, @StartingWhen + @InvoicingPersonID, @StartingWhen FROM Sales.OrderLines AS ol INNER JOIN Warehouse.StockItems AS si ON ol.StockItemID = si.StockItemID INNER JOIN Warehouse.StockItemHoldings AS sih ON si.StockItemID = sih.StockItemID WHERE ol.OrderID = @OrderID - ORDER BY ol.OrderLineID; + ORDER BY ol.OrderLineID; INSERT Warehouse.StockItemTransactions - (StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID, + (StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID, TransactionOccurredWhen, Quantity, LastEditedBy, LastEditedWhen) SELECT il.StockItemID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Stock Issue''), i.CustomerID, i.InvoiceID, NULL, NULL, - @StartingWhen, 0 - il.Quantity, @InvoicingPersonID, @StartingWhen + @StartingWhen, 0 - il.Quantity, @InvoicingPersonID, @StartingWhen FROM Sales.InvoiceLines AS il INNER JOIN Sales.Invoices AS i - ON il.InvoiceID = i.InvoiceID - WHERE i.InvoiceID = @InvoiceID + ON il.InvoiceID = i.InvoiceID + WHERE i.InvoiceID = @InvoiceID ORDER BY il.InvoiceLineID; WITH StockItemTotals AS ( - SELECT il.StockItemID, SUM(il.Quantity) AS TotalQuantity - FROM Sales.InvoiceLines aS il - WHERE il.InvoiceID = @InvoiceID - GROUP BY il.StockItemID + SELECT il.StockItemID, SUM(il.Quantity) AS TotalQuantity + FROM Sales.InvoiceLines aS il + WHERE il.InvoiceID = @InvoiceID + GROUP BY il.StockItemID ) UPDATE sih SET sih.QuantityOnHand -= sit.TotalQuantity, sih.LastEditedBy = @InvoicingPersonID, - sih.LastEditedWhen = @StartingWhen + sih.LastEditedWhen = @StartingWhen FROM Warehouse.StockItemHoldings AS sih - INNER JOIN StockItemTotals AS sit + INNER JOIN StockItemTotals AS sit ON sih.StockItemID = sit.StockItemID; SELECT @TransactionAmount = SUM(il.ExtendedPrice), - @TaxAmount = SUM(il.TaxAmount) + @TaxAmount = SUM(il.TaxAmount) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = @InvoiceID; - INSERT Sales.CustomerTransactions - (CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID, - TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount, + INSERT Sales.CustomerTransactions + (CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID, + TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount, OutstandingBalance, FinalizationDate, LastEditedBy, LastEditedWhen) VALUES (@BillToCustomerID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Customer Invoice''), @@ -1721,13 +1721,13 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.MakeTemporalChanges -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit -AS +AS BEGIN - + SET NOCOUNT ON; SET XACT_ABORT ON; @@ -1739,68 +1739,68 @@ BEGIN BEGIN SET @Counter = 0; SET @RowsToModify = CEILING(RAND() * 20); - + WHILE @Counter < @RowsToModify BEGIN - UPDATE [Application].Cities + UPDATE [Application].Cities SET LatestRecordedPopulation = LatestRecordedPopulation * 1.04, LastEditedBy = @StaffMember, - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE CityID = (SELECT TOP(1) CityID FROM [Application].Cities ORDER BY NEWID()); SET @Counter += 1; - END; + END; END; IF DAY(@StartingWhen) = 1 AND MONTH(@StartingWhen) = 7 BEGIN SET @Counter = 0; SET @RowsToModify = CEILING(RAND() * 20); - + WHILE @Counter < @RowsToModify BEGIN - UPDATE [Application].StateProvinces + UPDATE [Application].StateProvinces SET LatestRecordedPopulation = LatestRecordedPopulation * 1.04, LastEditedBy = @StaffMember, - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StateProvinceID = (SELECT TOP(1) StateProvinceID FROM [Application].StateProvinces ORDER BY NEWID()); SET @Counter += 1; - END; + END; END; IF DAY(@StartingWhen) = 1 AND MONTH(@StartingWhen) = 7 BEGIN SET @Counter = 0; SET @RowsToModify = CEILING(RAND() * 20); - + WHILE @Counter < @RowsToModify BEGIN - UPDATE [Application].Countries + UPDATE [Application].Countries SET LatestRecordedPopulation = LatestRecordedPopulation * 1.04, LastEditedBy = @StaffMember, - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE CountryID = (SELECT TOP(1) CountryID FROM [Application].Countries ORDER BY NEWID()); SET @Counter += 1; - END; + END; END; IF CAST(@StartingWhen AS date) = ''20150101'' BEGIN - UPDATE [Application].DeliveryMethods + UPDATE [Application].DeliveryMethods SET DeliveryMethodName = N''Chilled Van'', LastEditedBy = @StaffMember, - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE DeliveryMethodName = N''Van with Chiller''; END; IF CAST(@StartingWhen AS date) = ''20160101'' BEGIN - UPDATE [Application].PaymentMethods + UPDATE [Application].PaymentMethods SET PaymentMethodName = N''Credit-Card'', LastEditedBy = @StaffMember, - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE PaymentMethodName = N''Credit Card''; - INSERT [Application].TransactionTypes + INSERT [Application].TransactionTypes (TransactionTypeName, LastEditedBy, ValidFrom, ValidTo) VALUES (N''Contra'', @StaffMember, @StartingWhen, @EndOfTime); @@ -1811,7 +1811,7 @@ BEGIN ValidFrom = DATEADD(minute, 5, @StartingWhen) WHERE TransactionTypeName = N''Contra''; - UPDATE Warehouse.Colors + UPDATE Warehouse.Colors SET ColorName = N''Steel Gray'', LastEditedBy = @StaffMember, ValidFrom = @StartingWhen @@ -1824,52 +1824,52 @@ BEGIN DELETE Warehouse.PackageTypes WHERE PackageTypeName = N''Bin''; - UPDATE Warehouse.StockGroups + UPDATE Warehouse.StockGroups SET StockGroupName = N''Furry Footwear'', LastEditedBy = @StaffMember, - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockGroupName = N''Footwear''; END; IF CAST(@StartingWhen AS date) = ''20150101'' BEGIN - UPDATE Purchasing.SupplierCategories + UPDATE Purchasing.SupplierCategories SET SupplierCategoryName = N''Courier Services Supplier'', LastEditedBy = @StaffMember, - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE SupplierCategoryName = N''Courier''; END; IF CAST(@StartingWhen AS date) = ''20140101'' BEGIN - INSERT Sales.CustomerCategories + INSERT Sales.CustomerCategories (CustomerCategoryName, LastEditedBy, ValidFrom, ValidTo) VALUES (N''Retailer'', 1, @StartingWhen, @EndOfTime); - UPDATE Sales.CustomerCategories + UPDATE Sales.CustomerCategories SET CustomerCategoryName = N''General Retailer'', LastEditedBy = @StaffMember, ValidFrom = DATEADD(minute, 15, @StartingWhen) WHERE CustomerCategoryName = N''Retailer''; END; - + IF DAY(@StartingWhen) = 1 AND MONTH(@StartingWhen) = 7 BEGIN SET @Counter = 0; SET @RowsToModify = CEILING(RAND() * 20); - + WHILE @Counter < @RowsToModify BEGIN - UPDATE Sales.Customers + UPDATE Sales.Customers SET CreditLimit = CreditLimit * 1.05, LastEditedBy = @StaffMember, ValidFrom = @StartingWhen WHERE CustomerID = (SELECT TOP(1) CustomerID FROM Sales.Customers WHERE CreditLimit > 0 ORDER BY NEWID()); SET @Counter += 1; - END; + END; END; - + IF @IsSilentMode = 0 BEGIN PRINT N''Modifying a few temporal items ''; @@ -1884,11 +1884,11 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.PaySuppliers -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -1897,10 +1897,10 @@ BEGIN BEGIN PRINT N''Paying suppliers''; END; - - DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID - FROM [Application].People - WHERE IsEmployee <> 0 + + DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID + FROM [Application].People + WHERE IsEmployee <> 0 ORDER BY NEWID()); DECLARE @TransactionsToPay TABLE @@ -1912,32 +1912,32 @@ BEGIN OutstandingBalance decimal(18,2) ); - INSERT @TransactionsToPay + INSERT @TransactionsToPay (SupplierTransactionID, SupplierID, PurchaseOrderID, SupplierInvoiceNumber, OutstandingBalance) SELECT SupplierTransactionID, SupplierID, PurchaseOrderID, SupplierInvoiceNumber, OutstandingBalance - FROM Purchasing.SupplierTransactions + FROM Purchasing.SupplierTransactions WHERE IsFinalized = 0; BEGIN TRAN; - UPDATE Purchasing.SupplierTransactions + UPDATE Purchasing.SupplierTransactions SET OutstandingBalance = 0, FinalizationDate = @StartingWhen, LastEditedBy = @StaffMemberPersonID, - LastEditedWhen = @StartingWhen + LastEditedWhen = @StartingWhen WHERE SupplierTransactionID IN (SELECT SupplierTransactionID FROM @TransactionsToPay); - INSERT Purchasing.SupplierTransactions - (SupplierID, TransactionTypeID, PurchaseOrderID, PaymentMethodID, - SupplierInvoiceNumber, TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount, + INSERT Purchasing.SupplierTransactions + (SupplierID, TransactionTypeID, PurchaseOrderID, PaymentMethodID, + SupplierInvoiceNumber, TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount, OutstandingBalance, FinalizationDate, LastEditedBy, LastEditedWhen) SELECT ttp.SupplierID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Supplier Payment Issued''), NULL, (SELECT PaymentMethodID FROM [Application].PaymentMethods WHERE PaymentMethodName = N''EFT''), NULL, CAST(@StartingWhen AS date), 0, 0, 0 - SUM(ttp.OutstandingBalance), - 0, CAST(@StartingWhen AS date), @StaffMemberPersonID, @StartingWhen + 0, CAST(@StartingWhen AS date), @StaffMemberPersonID, @StartingWhen FROM @TransactionsToPay AS ttp GROUP BY ttp.SupplierID; - + COMMIT; END;'; @@ -1949,11 +1949,11 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.PerformStocktake -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -1963,9 +1963,9 @@ BEGIN PRINT N''Performing stocktake''; END; - DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID - FROM [Application].People - WHERE IsEmployee <> 0 + DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID + FROM [Application].People + WHERE IsEmployee <> 0 ORDER BY NEWID()); DECLARE @Counter int = 0; @@ -1983,8 +1983,8 @@ BEGIN WHILE @Counter < @NumberOfAdjustedStockItems BEGIN SET @QuantityToAdjust = 5 - CEILING(RAND() * 10); - SET @StockItemIDToAdjust = (SELECT TOP(1) StockItemID - FROM Warehouse.StockItemHoldings + SET @StockItemIDToAdjust = (SELECT TOP(1) StockItemID + FROM Warehouse.StockItemHoldings WHERE (QuantityOnHand + @QuantityToAdjust) >= 0 ORDER BY NEWID()); @@ -1996,12 +1996,12 @@ BEGIN LastEditedBy = @StaffMemberPersonID, LastEditedWhen = @StartingWhen WHERE StockItemID = @StockItemIDToAdjust; - + INSERT Warehouse.StockItemTransactions - (StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID, + (StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID, TransactionOccurredWhen, Quantity, LastEditedBy, LastEditedWhen) VALUES - (@StockItemIDToAdjust, + (@StockItemIDToAdjust, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Stock Adjustment at Stocktake''), NULL, NULL, NULL, NULL, @StartingWhen, @QuantityToAdjust, @StaffMemberPersonID, @StartingWhen); @@ -2019,11 +2019,11 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.PickStockForCustomerOrders -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -2040,7 +2040,7 @@ BEGIN OrderID int PRIMARY KEY ); - INSERT @UninvoicedOrders + INSERT @UninvoicedOrders SELECT o.OrderID FROM Sales.Orders AS o WHERE NOT EXISTS (SELECT 1 FROM Sales.Invoices AS i WHERE i.OrderID = o.OrderID); @@ -2058,14 +2058,14 @@ BEGIN FROM Sales.OrderLines AS ol INNER JOIN @UninvoicedOrders AS uo ON ol.OrderID = uo.OrderID - WHERE ol.PickingCompletedWhen IS NULL + WHERE ol.PickingCompletedWhen IS NULL GROUP BY ol.StockItemID ) INSERT @StockAlreadyAllocated (StockItemID, QuantityAllocated) SELECT sa.StockItemID, sa.TotalPickedQuantity FROM StockAlreadyAllocated AS sa; - DECLARE OrderLineList CURSOR FAST_FORWARD READ_ONLY + DECLARE OrderLineList CURSOR FAST_FORWARD READ_ONLY FOR SELECT ol.OrderID, ol.OrderLineID, ol.StockItemID, ol.Quantity FROM Sales.OrderLines AS ol @@ -2077,9 +2077,9 @@ BEGIN DECLARE @StockItemID int; DECLARE @Quantity int; DECLARE @AvailableStock int; - DECLARE @PickingPersonID int = (SELECT TOP(1) PersonID - FROM [Application].People - WHERE IsEmployee <> 0 + DECLARE @PickingPersonID int = (SELECT TOP(1) PersonID + FROM [Application].People + WHERE IsEmployee <> 0 ORDER BY NEWID()); OPEN OrderLineList; @@ -2091,7 +2091,7 @@ BEGIN SET @AvailableStock = (SELECT QuantityOnHand FROM Warehouse.StockItemHoldings AS sih WHERE sih.StockItemID = @StockItemID); SET @AvailableStock -= COALESCE((SELECT QuantityAllocated FROM @StockAlreadyAllocated AS saa WHERE saa.StockItemID = @StockItemID), 0); - IF @AvailableStock >= @Quantity + IF @AvailableStock >= @Quantity BEGIN BEGIN TRAN; @@ -2104,23 +2104,23 @@ BEGIN INSERT (StockItemID, QuantityAllocated) VALUES (sa.StockItemID, sa.Quantity); -- reserve the required stock - UPDATE Sales.OrderLines + UPDATE Sales.OrderLines SET PickedQuantity = @Quantity, PickingCompletedWhen = @StartingWhen, LastEditedBy = @PickingPersonID, - LastEditedWhen = @StartingWhen + LastEditedWhen = @StartingWhen WHERE OrderLineID = @OrderLineID; - + -- mark the order as ready to invoice (picking complete) if all lines picked - IF NOT EXISTS (SELECT 1 FROM Sales.OrderLines AS ol - WHERE ol.OrderID = @OrderID + IF NOT EXISTS (SELECT 1 FROM Sales.OrderLines AS ol + WHERE ol.OrderID = @OrderID AND ol.PickingCompletedWhen IS NULL) BEGIN - UPDATE Sales.Orders + UPDATE Sales.Orders SET PickingCompletedWhen = @StartingWhen, PickedByPersonID = @PickingPersonID, LastEditedBy = @PickingPersonID, - LastEditedWhen = @StartingWhen + LastEditedWhen = @StartingWhen WHERE OrderID = @OrderID; END; @@ -2142,11 +2142,11 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.PlaceSupplierOrders -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -2185,25 +2185,25 @@ BEGIN ( SELECT si.StockItemID, si.StockItemName AS [Description], - si.SupplierID, - sih.TargetStockLevel, - sih.ReorderLevel, + si.SupplierID, + sih.TargetStockLevel, + sih.ReorderLevel, si.QuantityPerOuter, si.LeadTimeDays, si.OuterPackageID, sih.QuantityOnHand, sih.LastCostPrice, - COALESCE((SELECT SUM(ol.Quantity) + COALESCE((SELECT SUM(ol.Quantity) FROM Sales.OrderLines AS ol - WHERE ol.StockItemID = si.StockItemID + WHERE ol.StockItemID = si.StockItemID AND ol.PickingCompletedWhen IS NULL), 0) AS StockNeededForOrders, - COALESCE((SELECT si.QuantityPerOuter * SUM(pol.OrderedOuters - pol.ReceivedOuters) + COALESCE((SELECT si.QuantityPerOuter * SUM(pol.OrderedOuters - pol.ReceivedOuters) FROM Purchasing.PurchaseOrderLines AS pol - WHERE pol.StockItemID = si.StockItemID - AND pol.IsOrderLineFinalized = 0), 0) AS StockOnOrder + WHERE pol.StockItemID = si.StockItemID + AND pol.IsOrderLineFinalized = 0), 0) AS StockOnOrder FROM Warehouse.StockItems AS si INNER JOIN Warehouse.StockItemHoldings AS sih - ON si.StockItemID = sih.StockItemID + ON si.StockItemID = sih.StockItemID ), StockItemsToOrder AS @@ -2216,7 +2216,7 @@ BEGIN sitc.QuantityPerOuter, sitc.LeadTimeDays, sitc.OuterPackageID, - sitc.LastCostPrice + sitc.LastCostPrice FROM StockItemsToCheck AS sitc WHERE (sitc.QuantityOnHand + sitc.StockOnOrder - sitc.StockNeededForOrders) < sitc.ReorderLevel AND sitc.QuantityPerOuter <> 0 @@ -2232,30 +2232,30 @@ BEGIN FROM StockItemsToOrder AS sito; INSERT @Orders (SupplierID, PurchaseOrderID, DeliveryMethodID, ContactPersonID, SupplierReference) - - SELECT s.SupplierID, NEXT VALUE FOR Sequences.PurchaseOrderID, s.DeliveryMethodID, + + SELECT s.SupplierID, NEXT VALUE FOR Sequences.PurchaseOrderID, s.DeliveryMethodID, (SELECT TOP(1) PersonID FROM [Application].People WHERE IsEmployee <> 0), s.SupplierReference FROM Purchasing.Suppliers AS s WHERE s.SupplierID IN (SELECT SupplierID FROM @OrderLines); - INSERT Purchasing.PurchaseOrders - (PurchaseOrderID, SupplierID, OrderDate, DeliveryMethodID, ContactPersonID, - ExpectedDeliveryDate, SupplierReference, IsOrderFinalized, Comments, + INSERT Purchasing.PurchaseOrders + (PurchaseOrderID, SupplierID, OrderDate, DeliveryMethodID, ContactPersonID, + ExpectedDeliveryDate, SupplierReference, IsOrderFinalized, Comments, InternalComments, LastEditedBy, LastEditedWhen) SELECT o.PurchaseOrderID, o.SupplierID, CAST(@StartingWhen AS date), o.DeliveryMethodID, o.ContactPersonID, DATEADD(day, (SELECT MAX(LeadTimeDays) FROM @OrderLines), CAST(@StartingWhen AS date)), - o.SupplierReference, 0, NULL, + o.SupplierReference, 0, NULL, NULL, 1, @StartingWhen FROM @Orders AS o; - - INSERT Purchasing.PurchaseOrderLines - (PurchaseOrderID, StockItemID, OrderedOuters, [Description], - ReceivedOuters, PackageTypeID, ExpectedUnitPricePerOuter, LastReceiptDate, + + INSERT Purchasing.PurchaseOrderLines + (PurchaseOrderID, StockItemID, OrderedOuters, [Description], + ReceivedOuters, PackageTypeID, ExpectedUnitPricePerOuter, LastReceiptDate, IsOrderLineFinalized, LastEditedBy, LastEditedWhen) SELECT o.PurchaseOrderID, ol.StockItemID, ol.QuantityOfOuters, ol.[Description], 0, ol.OuterPackageID, ol.LastOuterCostPrice, NULL, - 0, @ContactPersonID, @StartingWhen + 0, @ContactPersonID, @StartingWhen FROM @OrderLines AS ol INNER JOIN @Orders AS o ON ol.SupplierID = o.SupplierID; @@ -2270,12 +2270,12 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.ProcessCustomerPayments -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -2284,10 +2284,10 @@ BEGIN BEGIN PRINT N''Processing customer payments''; END; - - DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID - FROM [Application].People - WHERE IsEmployee <> 0 + + DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID + FROM [Application].People + WHERE IsEmployee <> 0 ORDER BY NEWID()); DECLARE @TransactionsToReceive TABLE @@ -2298,32 +2298,32 @@ BEGIN OutstandingBalance decimal(18,2) ); - INSERT @TransactionsToReceive + INSERT @TransactionsToReceive (CustomerTransactionID, CustomerID, InvoiceID, OutstandingBalance) SELECT CustomerTransactionID, CustomerID, InvoiceID, OutstandingBalance - FROM Sales.CustomerTransactions + FROM Sales.CustomerTransactions WHERE IsFinalized = 0; BEGIN TRAN; - UPDATE Sales.CustomerTransactions + UPDATE Sales.CustomerTransactions SET OutstandingBalance = 0, FinalizationDate = @StartingWhen, LastEditedBy = @StaffMemberPersonID, - LastEditedWhen = @StartingWhen + LastEditedWhen = @StartingWhen WHERE CustomerTransactionID IN (SELECT CustomerTransactionID FROM @TransactionsToReceive); - INSERT Sales.CustomerTransactions - (CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID, TransactionDate, - AmountExcludingTax, TaxAmount, TransactionAmount, OutstandingBalance, + INSERT Sales.CustomerTransactions + (CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID, TransactionDate, + AmountExcludingTax, TaxAmount, TransactionAmount, OutstandingBalance, FinalizationDate, LastEditedBy, LastEditedWhen) SELECT ttr.CustomerID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Customer Payment Received''), NULL, (SELECT PaymentMethodID FROM [Application].PaymentMethods WHERE PaymentMethodName = N''EFT''), CAST(@StartingWhen AS date), 0, 0, 0 - SUM(ttr.OutstandingBalance), - 0, CAST(@StartingWhen AS date), @StaffMemberPersonID, @StartingWhen + 0, CAST(@StartingWhen AS date), @StaffMemberPersonID, @StartingWhen FROM @TransactionsToReceive AS ttr GROUP BY ttr.CustomerID; - + COMMIT; END;'; @@ -2335,11 +2335,11 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.ReceivePurchaseOrders -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -2349,9 +2349,9 @@ BEGIN PRINT N''Receiving stock from purchase orders''; END; - DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID - FROM [Application].People - WHERE IsEmployee <> 0 + DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID + FROM [Application].People + WHERE IsEmployee <> 0 ORDER BY NEWID()); DECLARE @PurchaseOrderID int; DECLARE @SupplierID int; @@ -2373,15 +2373,15 @@ BEGIN BEGIN TRAN; - UPDATE Purchasing.PurchaseOrderLines + UPDATE Purchasing.PurchaseOrderLines SET ReceivedOuters = OrderedOuters, IsOrderLineFinalized = 1, LastReceiptDate = CAST(@StartingWhen as date), LastEditedBy = @StaffMemberPersonID, LastEditedWhen = @StartingWhen WHERE PurchaseOrderID = @PurchaseOrderID; - - UPDATE sih + + UPDATE sih SET sih.QuantityOnHand += pol.ReceivedOuters * si.QuantityPerOuter, sih.LastEditedBy = @StaffMemberPersonID, sih.LastEditedWhen = @StartingWhen @@ -2392,20 +2392,20 @@ BEGIN ON sih.StockItemID = si.StockItemID; INSERT Warehouse.StockItemTransactions - (StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID, + (StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID, TransactionOccurredWhen, Quantity, LastEditedBy, LastEditedWhen) SELECT pol.StockItemID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Stock Receipt''), NULL, NULL, @SupplierID, pol.PurchaseOrderID, @StartingWhen, pol.ReceivedOuters * si.QuantityPerOuter, @StaffMemberPersonID, @StartingWhen FROM Purchasing.PurchaseOrderLines AS pol INNER JOIN Warehouse.StockItems AS si - ON pol.StockItemID = si.StockItemID + ON pol.StockItemID = si.StockItemID WHERE pol.PurchaseOrderID = @PurchaseOrderID; - UPDATE Purchasing.PurchaseOrders + UPDATE Purchasing.PurchaseOrders SET IsOrderFinalized = 1, LastEditedBy = @StaffMemberPersonID, - LastEditedWhen = @StartingWhen + LastEditedWhen = @StartingWhen WHERE PurchaseOrderID = @PurchaseOrderID; SELECT @TotalExcludingTax = SUM(ROUND(pol.OrderedOuters * pol.ExpectedUnitPricePerOuter,2)), @@ -2413,13 +2413,13 @@ BEGIN + SUM(ROUND(pol.OrderedOuters * pol.ExpectedUnitPricePerOuter * si.TaxRate / 100.0,2)) FROM Purchasing.PurchaseOrderLines AS pol INNER JOIN Warehouse.StockItems AS si - ON pol.StockItemID = si.StockItemID + ON pol.StockItemID = si.StockItemID WHERE pol.PurchaseOrderID = @PurchaseOrderID; - INSERT Purchasing.SupplierTransactions - (SupplierID, TransactionTypeID, PurchaseOrderID, PaymentMethodID, - SupplierInvoiceNumber, TransactionDate, AmountExcludingTax, - TaxAmount, TransactionAmount, OutstandingBalance, + INSERT Purchasing.SupplierTransactions + (SupplierID, TransactionTypeID, PurchaseOrderID, PaymentMethodID, + SupplierInvoiceNumber, TransactionDate, AmountExcludingTax, + TaxAmount, TransactionAmount, OutstandingBalance, FinalizationDate, LastEditedBy, LastEditedWhen) VALUES (@SupplierID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Supplier Invoice''), @@ -2427,7 +2427,7 @@ BEGIN CAST(CEILING(RAND() * 10000) AS nvarchar(20)), CAST(@StartingWhen AS date), @TotalExcludingTax, @TotalIncludingTax - @TotalExcludingTax, @TotalIncludingTax, @TotalIncludingTax, NULL, @StaffMemberPersonID, @StartingWhen); - + COMMIT; FETCH NEXT FROM PurchaseOrderList INTO @PurchaseOrderID, @SupplierID; @@ -2446,11 +2446,11 @@ END;'; CREATE PROCEDURE DataLoadSimulation.RecordColdRoomTemperatures @AverageSecondsBetweenReadings int, @NumberOfSensors int, -@CurrentDateTime datetime2(7), +@CurrentDateTime datetime2(7), @EndOfTime datetime2(7), @IsSilentMode bit WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; @@ -2474,19 +2474,19 @@ BEGIN BEGIN SET @Temperature = 3 + RAND() * 2; - DELETE Warehouse.ColdRoomTemperatures - OUTPUT deleted.ColdRoomTemperatureID, + DELETE Warehouse.ColdRoomTemperatures + OUTPUT deleted.ColdRoomTemperatureID, deleted.ColdRoomSensorNumber, - deleted.RecordedWhen, + deleted.RecordedWhen, deleted.Temperature, deleted.ValidFrom, @TimeCounter - INTO Warehouse.ColdRoomTemperatures_Archive + INTO Warehouse.ColdRoomTemperatures_Archive WHERE ColdRoomSensorNumber = @SensorCounter + 1; - INSERT Warehouse.ColdRoomTemperatures + INSERT Warehouse.ColdRoomTemperatures (ColdRoomSensorNumber, RecordedWhen, Temperature, ValidFrom, ValidTo) - VALUES + VALUES (@SensorCounter + 1, @TimeCounter, @Temperature, @TimeCounter, @EndOfTime); SET @SensorCounter += 1; @@ -2505,11 +2505,11 @@ END;'; CREATE PROCEDURE DataLoadSimulation.RecordDeliveryVanTemperatures @AverageSecondsBetweenReadings int, @NumberOfSensors int, -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @IsSilentMode bit WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; @@ -2546,21 +2546,21 @@ BEGIN SET @FullSensorData = N''{"Recordings": '' + N''['' - + N''{"type":"Feature", "geometry": {"type":"Point", "coordinates":['' + + N''{"type":"Feature", "geometry": {"type":"Point", "coordinates":['' + CAST(@Longitude AS nvarchar(20)) + N'','' + CAST(@Latitude AS nvarchar(20)) + N''] }, "properties":{"rego":"'' + STRING_ESCAPE(@VehicleRegistration, N''json'') - + N''","sensor":"'' + CAST(@SensorCounter + 1 AS nvarchar(20)) + + N''","sensor":"'' + CAST(@SensorCounter + 1 AS nvarchar(20)) + N'',"when":"'' + CONVERT(nvarchar(30), @TimeCounter, 126) + N''","temp":'' + CAST(@Temperature AS nvarchar(20)) + N''}} ]''; - - INSERT Warehouse.VehicleTemperatures - (VehicleRegistration, ChillerSensorNumber, - RecordedWhen, Temperature, + + INSERT Warehouse.VehicleTemperatures + (VehicleRegistration, ChillerSensorNumber, + RecordedWhen, Temperature, FullSensorData, IsCompressed, CompressedSensorData) - VALUES + VALUES (@VehicleRegistration, @SensorCounter + 1, - @TimeCounter, @Temperature, + @TimeCounter, @Temperature, CASE WHEN @IsCompressed = 0 THEN @FullSensorData END, @IsCompressed, CASE WHEN @IsCompressed <> 0 THEN COMPRESS(@FullSensorData) END); @@ -2579,12 +2579,12 @@ END;'; BEGIN SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.RecordInvoiceDeliveries -@CurrentDateTime datetime2(7), -@StartingWhen datetime, +@CurrentDateTime datetime2(7), +@StartingWhen datetime, @EndOfTime datetime2(7), @IsSilentMode bit WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -2594,9 +2594,9 @@ BEGIN PRINT N''Recording invoice deliveries''; END; - DECLARE @DeliveryDriverPersonID int = (SELECT TOP(1) PersonID - FROM [Application].People - WHERE IsEmployee <> 0 + DECLARE @DeliveryDriverPersonID int = (SELECT TOP(1) PersonID + FROM [Application].People + WHERE IsEmployee <> 0 ORDER BY NEWID()); DECLARE @ReturnedDeliveryData nvarchar(max); @@ -2612,14 +2612,14 @@ BEGIN DECLARE InvoiceList CURSOR FAST_FORWARD READ_ONLY FOR - SELECT i.InvoiceID, i.ReturnedDeliveryData, c.CustomerName, p.FullName, ct.[Location].Lat, ct.[Location].Long + SELECT i.InvoiceID, i.ReturnedDeliveryData, c.CustomerName, p.FullName, ct.[Location].Lat, ct.[Location].Long FROM Sales.Invoices AS i INNER JOIN Sales.Customers AS c - ON i.CustomerID = c.CustomerID + ON i.CustomerID = c.CustomerID INNER JOIN [Application].Cities AS ct - ON c.DeliveryCityID = ct.CityID + ON c.DeliveryCityID = ct.CityID INNER JOIN [Application].People AS p - ON c.PrimaryContactPersonID = p.PersonID + ON c.PrimaryContactPersonID = p.PersonID WHERE i.ConfirmedDeliveryTime IS NULL AND i.InvoiceDate < CAST(@StartingWhen AS date) ORDER BY i.InvoiceID; @@ -2639,7 +2639,7 @@ BEGIN SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.DriverID'', @DeliveryDriverPersonID); SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.Latitude'', @Latitude); SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.Longitude'', @Longitude); - + SET @IsDelivered = 0; IF RAND() < 0.1 -- 10 % chance of non-delivery on this attempt @@ -2654,7 +2654,7 @@ BEGIN SET @ReturnedDeliveryData = JSON_MODIFY(@ReturnedDeliveryData, N''$.DeliveredWhen'', CONVERT(nvarchar(20), @DeliveryAttemptWhen, 126)); SET @ReturnedDeliveryData = JSON_MODIFY(@ReturnedDeliveryData, N''$.ReceivedBy'', @PrimaryContactFullName); - UPDATE Sales.Invoices + UPDATE Sales.Invoices SET ReturnedDeliveryData = @ReturnedDeliveryData, LastEditedBy = @DeliveryDriverPersonID, LastEditedWhen = @StartingWhen @@ -2675,16 +2675,16 @@ END;'; SET @SQL = N' CREATE PROCEDURE DataLoadSimulation.UpdateCustomFields @CurrentDateTime AS date -WITH EXECUTE AS OWNER +WITH EXECUTE AS OWNER AS BEGIN DECLARE @StartingWhen datetime2(7) = CAST(@CurrentDateTime AS date); - + SET @StartingWhen = DATEADD(hour, 23, @StartingWhen); -- Populate custom data for stock items - UPDATE Warehouse.StockItems + UPDATE Warehouse.StockItems SET CustomFields = N''{ "CountryOfManufacture": '' + CASE WHEN IsChillerStock <> 0 THEN N''"USA", "ShelfLife": "7 days"'' WHEN StockItemName LIKE N''%USB food%'' THEN N''"Japan"'' @@ -2703,90 +2703,90 @@ BEGIN ValidFrom = @StartingWhen; SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - - UPDATE Warehouse.StockItems + + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Radio Control''), - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockItemName LIKE N''RC %''; - + SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - UPDATE Warehouse.StockItems + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Realistic Sound''), - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockItemName LIKE N''RC %''; SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - UPDATE Warehouse.StockItems + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Vintage''), - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockItemName LIKE N''%vintage%''; - + SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - UPDATE Warehouse.StockItems + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Halloween Fun''), - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockItemName LIKE N''%halloween%''; - + SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - UPDATE Warehouse.StockItems + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Super Value''), - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockItemName LIKE N''%pack of%''; SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - - UPDATE Warehouse.StockItems + + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''So Realistic''), - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockItemName LIKE N''%ride on%''; SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - - UPDATE Warehouse.StockItems + + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Comfortable''), - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockItemName LIKE N''%slipper%''; - + SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - UPDATE Warehouse.StockItems + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Long Battery Life''), - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockItemName LIKE N''%slipper%''; - + SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - UPDATE Warehouse.StockItems + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', CASE WHEN StockItemID % 2 = 0 THEN N''32GB'' ELSE N''16GB'' END), - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockItemName LIKE N''%USB food%''; - + SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - UPDATE Warehouse.StockItems + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Comedy''), ValidFrom = @StartingWhen WHERE StockItemName LIKE N''%joke%''; - + SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - UPDATE Warehouse.StockItems + UPDATE Warehouse.StockItems SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''USB Powered''), - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE StockItemName LIKE N''%USB%''; - + SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - UPDATE si + UPDATE si SET si.CustomFields = JSON_MODIFY(si.CustomFields, N''append $.Tags'', N''Limited Stock''), - ValidFrom = @StartingWhen - FROM Warehouse.StockItems AS si - WHERE EXISTS (SELECT 1 - FROM Warehouse.StockItemStockGroups AS sisg + ValidFrom = @StartingWhen + FROM Warehouse.StockItems AS si + WHERE EXISTS (SELECT 1 + FROM Warehouse.StockItemStockGroups AS sisg INNER JOIN Warehouse.StockGroups AS sg ON sisg.StockGroupID = sg.StockGroupID WHERE si.StockItemID = sisg.StockItemID @@ -2796,12 +2796,12 @@ BEGIN SET @StartingWhen = DATEADD(minute, 1, @StartingWhen); - DECLARE EmployeeList CURSOR FAST_FORWARD READ_ONLY + DECLARE EmployeeList CURSOR FAST_FORWARD READ_ONLY FOR - SELECT PersonID, IsSalesperson - FROM [Application].People + SELECT PersonID, IsSalesperson + FROM [Application].People WHERE IsEmployee <> 0; - + DECLARE @EmployeeID int; DECLARE @IsSalesperson bit; DECLARE @CustomFields nvarchar(max); @@ -2810,22 +2810,22 @@ BEGIN DECLARE @LanguageCounter int; DECLARE @OtherLanguages TABLE ( LanguageName nvarchar(50) ); DECLARE @LanguageName nvarchar(50); - + OPEN EmployeeList; FETCH NEXT FROM EmployeeList INTO @EmployeeID, @IsSalesperson; - + WHILE @@FETCH_STATUS = 0 BEGIN SET @CustomFields = N''{ "OtherLanguages": [] }''; - + SET @NumberOfAdditionalLanguages = FLOOR(RAND() * 4); DELETE @OtherLanguages; SET @LanguageCounter = 0; WHILE @LanguageCounter < @NumberOfAdditionalLanguages BEGIN - SET @LanguageName = (SELECT TOP(1) alias - FROM sys.syslanguages - WHERE alias NOT LIKE N''%English%'' + SET @LanguageName = (SELECT TOP(1) alias + FROM sys.syslanguages + WHERE alias NOT LIKE N''%English%'' AND alias NOT LIKE N''%Brazil%'' ORDER BY NEWID()); IF @LanguageName LIKE N''%Chinese%'' SET @LanguageName = N''Chinese''; @@ -2836,10 +2836,10 @@ BEGIN END; SET @LanguageCounter += 1; END; - - SET @CustomFields = JSON_MODIFY(@CustomFields, N''$.HireDate'', + + SET @CustomFields = JSON_MODIFY(@CustomFields, N''$.HireDate'', CONVERT(nvarchar(20), DATEADD(day, 0 - CEILING(RAND() * 2000) - 100, ''20130101''), 126)); - + SET @JobTitle = N''Team Member''; SET @JobTitle = CASE WHEN RAND() < 0.05 THEN N''General Manager'' WHEN RAND() < 0.1 THEN N''Manager'' @@ -2848,23 +2848,23 @@ BEGIN ELSE @JobTitle END; SET @CustomFields = JSON_MODIFY(@CustomFields, N''$.Title'', @JobTitle); - + IF @IsSalesperson <> 0 BEGIN - SET @CustomFields = JSON_MODIFY(@CustomFields, N''$.PrimarySalesTerritory'', + SET @CustomFields = JSON_MODIFY(@CustomFields, N''$.PrimarySalesTerritory'', (SELECT TOP(1) SalesTerritory FROM [Application].StateProvinces ORDER BY NEWID())); SET @CustomFields = JSON_MODIFY(@CustomFields, N''$.CommissionRate'', CAST(CAST(RAND() * 5 AS decimal(18,2)) AS nvarchar(20))); END; - UPDATE [Application].People + UPDATE [Application].People SET CustomFields = @CustomFields, - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE PersonID = @EmployeeID; FETCH NEXT FROM EmployeeList INTO @EmployeeID, @IsSalesperson; END; - + CLOSE EmployeeList; DEALLOCATE EmployeeList; @@ -2893,7 +2893,7 @@ BEGIN WHEN 6 THEN ''mm/dd/yy'' ELSE ''mm/dd/yy'' END - + N''","timeZone": "PST"'' + + N''","timeZone": "PST"'' + N'',"table":{"pagingType":"'' + CASE (PersonID % 5) WHEN 0 THEN ''numbers'' WHEN 1 THEN ''full_numbers'' @@ -2908,7 +2908,7 @@ BEGIN WHEN 3 THEN ''10'' ELSE ''10'' END + N''},"favoritesOnDashboard":true}'', - ValidFrom = @StartingWhen + ValidFrom = @StartingWhen WHERE UserPreferences IS NOT NULL; END;'; EXECUTE (@SQL); @@ -2961,52 +2961,52 @@ BEGIN SET @IsMonday = 0; SET @IsWeekday = 1; - IF @Weekday = 7 + IF @Weekday = 7 BEGIN SET @IsSaturday = 1; SET @IsWeekday = 0; END; - IF @Weekday = 1 + IF @Weekday = 1 BEGIN SET @IsSunday = 1; SET @IsWeekday = 0; END; IF @Weekday = 2 SET @IsMonday = 1; - + -- Purchase orders IF @IsWeekday <> 0 BEGIN -- Start receiving purchase orders at 7AM on weekdays - SET @StartingWhen = DATEADD(hour, 7, @CurrentDateTime); + SET @StartingWhen = DATEADD(hour, 7, @CurrentDateTime); EXEC DataLoadSimulation.ReceivePurchaseOrders @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode; END; -- Password changes - SET @StartingWhen = DATEADD(hour, 8, @CurrentDateTime); + SET @StartingWhen = DATEADD(hour, 8, @CurrentDateTime); EXEC DataLoadSimulation.ChangePasswords @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode; -- Activate new website users SET @StartingWhen = DATEADD(minute, 10, DATEADD(hour, 8, @CurrentDateTime)); EXEC DataLoadSimulation.ActivateWebsiteLogons @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode; - + -- Payments to suppliers - IF DATEPART(weekday, @CurrentDateTime) = 2 + IF DATEPART(weekday, @CurrentDateTime) = 2 BEGIN SET @StartingWhen = DATEADD(hour, 9, @CurrentDateTime); -- Suppliers are paid on Monday mornings EXEC DataLoadSimulation.PaySuppliers @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode; END; - + -- Customer orders received - SET @StartingWhen = DATEADD(hour, 10, @CurrentDateTime); + SET @StartingWhen = DATEADD(hour, 10, @CurrentDateTime); SET @NumberOfCustomerOrders = @AverageNumberOfCustomerOrdersPerDay / 2 + CEILING(RAND() * @AverageNumberOfCustomerOrdersPerDay); - SET @NumberOfCustomerOrders = CASE DATEPART(weekday, @CurrentDateTime) - WHEN 7 + SET @NumberOfCustomerOrders = CASE DATEPART(weekday, @CurrentDateTime) + WHEN 7 THEN FLOOR(@NumberOfCustomerOrders * @SaturdayPercentageOfNormalWorkDay / 100) WHEN 1 THEN FLOOR(@NumberOfCustomerOrders * @SundayPercentageOfNormalWorkDay / 100) ELSE @NumberOfCustomerOrders - END; + END; SET @NumberOfCustomerOrders = FLOOR(@NumberOfCustomerOrders * CASE WHEN YEAR(@StartingWhen) = 2013 THEN 1.0 WHEN YEAR(@StartingWhen) = 2014 THEN 1.12 WHEN YEAR(@StartingWhen) = 2015 THEN 1.21 @@ -3018,7 +3018,7 @@ BEGIN -- Pick any customer orders that can be picked SET @StartingWhen = DATEADD(hour, 11, @CurrentDateTime); EXEC DataLoadSimulation.PickStockForCustomerOrders @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode; - + -- Process any payments from customers IF @Weekday <> 0 BEGIN @@ -3084,8 +3084,8 @@ BEGIN END; IF @IsSilentMode = 0 - BEGIN - PRINT N'' ''; + BEGIN + PRINT N'' ''; END; SET @CurrentDateTime = DATEADD(day, 1, @CurrentDateTime); @@ -3114,7 +3114,7 @@ DROP PROCEDURE IF EXISTS DataLoadSimulation.Configuration_RemoveDataLoadSimulati GO CREATE PROCEDURE DataLoadSimulation.Configuration_RemoveDataLoadSimulationProcedures -WITH EXECUTE AS OWNER +WITH EXECUTE AS OWNER AS BEGIN SET NOCOUNT ON; @@ -3166,63 +3166,63 @@ BEGIN DECLARE @DiscountedUnitPrice decimal(18,2); SELECT @BuyingGroupID = BuyingGroupID, - @CustomerCategoryID = CustomerCategoryID - FROM Sales.Customers + @CustomerCategoryID = CustomerCategoryID + FROM Sales.Customers WHERE CustomerID = @CustomerID; - SELECT @UnitPrice = si.UnitPrice - FROM Warehouse.StockItems AS si + SELECT @UnitPrice = si.UnitPrice + FROM Warehouse.StockItems AS si WHERE si.StockItemID = @StockItemID; SET @CalculatedPrice = @UnitPrice; - SET @LowestUnitPrice = (SELECT MIN(sd.UnitPrice) + SET @LowestUnitPrice = (SELECT MIN(sd.UnitPrice) FROM Sales.SpecialDeals AS sd WHERE ((sd.StockItemID = @StockItemID) OR (sd.StockItemID IS NULL)) AND ((sd.CustomerID = @CustomerID) OR (sd.CustomerID IS NULL)) AND ((sd.BuyingGroupID = @BuyingGroupID) OR (sd.BuyingGroupID IS NULL)) AND ((sd.CustomerCategoryID = @CustomerCategoryID) OR (sd.CustomerCategoryID IS NULL)) AND ((sd.StockGroupID IS NULL) OR EXISTS (SELECT 1 FROM Warehouse.StockItemStockGroups AS sisg - WHERE sisg.StockItemID = @StockItemID + WHERE sisg.StockItemID = @StockItemID AND sisg.StockGroupID = sd.StockGroupID)) AND sd.UnitPrice IS NOT NULL AND @PricingDate BETWEEN sd.StartDate AND sd.EndDate); - IF @LowestUnitPrice IS NOT NULL AND @LowestUnitPrice < @UnitPrice + IF @LowestUnitPrice IS NOT NULL AND @LowestUnitPrice < @UnitPrice BEGIN SET @CalculatedPrice = @LowestUnitPrice; END; - SET @HighestDiscountAmount = (SELECT MAX(sd.DiscountAmount) + SET @HighestDiscountAmount = (SELECT MAX(sd.DiscountAmount) FROM Sales.SpecialDeals AS sd WHERE ((sd.StockItemID = @StockItemID) OR (sd.StockItemID IS NULL)) AND ((sd.CustomerID = @CustomerID) OR (sd.CustomerID IS NULL)) AND ((sd.BuyingGroupID = @BuyingGroupID) OR (sd.BuyingGroupID IS NULL)) AND ((sd.CustomerCategoryID = @CustomerCategoryID) OR (sd.CustomerCategoryID IS NULL)) AND ((sd.StockGroupID IS NULL) OR EXISTS (SELECT 1 FROM Warehouse.StockItemStockGroups AS sisg - WHERE sisg.StockItemID = @StockItemID + WHERE sisg.StockItemID = @StockItemID AND sisg.StockGroupID = sd.StockGroupID)) AND sd.DiscountAmount IS NOT NULL AND @PricingDate BETWEEN sd.StartDate AND sd.EndDate); - IF @HighestDiscountAmount IS NOT NULL AND (@UnitPrice - @HighestDiscountAmount) < @CalculatedPrice + IF @HighestDiscountAmount IS NOT NULL AND (@UnitPrice - @HighestDiscountAmount) < @CalculatedPrice BEGIN SET @CalculatedPrice = @UnitPrice - @HighestDiscountAmount; END; - SET @HighestDiscountPercentage = (SELECT MAX(sd.DiscountPercentage) + SET @HighestDiscountPercentage = (SELECT MAX(sd.DiscountPercentage) FROM Sales.SpecialDeals AS sd WHERE ((sd.StockItemID = @StockItemID) OR (sd.StockItemID IS NULL)) AND ((sd.CustomerID = @CustomerID) OR (sd.CustomerID IS NULL)) AND ((sd.BuyingGroupID = @BuyingGroupID) OR (sd.BuyingGroupID IS NULL)) AND ((sd.CustomerCategoryID = @CustomerCategoryID) OR (sd.CustomerCategoryID IS NULL)) AND ((sd.StockGroupID IS NULL) OR EXISTS (SELECT 1 FROM Warehouse.StockItemStockGroups AS sisg - WHERE sisg.StockItemID = @StockItemID + WHERE sisg.StockItemID = @StockItemID AND sisg.StockGroupID = sd.StockGroupID)) AND sd.DiscountPercentage IS NOT NULL AND @PricingDate BETWEEN sd.StartDate AND sd.EndDate); - IF @HighestDiscountPercentage IS NOT NULL + IF @HighestDiscountPercentage IS NOT NULL BEGIN SET @DiscountedUnitPrice = ROUND(@UnitPrice * @HighestDiscountPercentage / 100.0, 2); IF @DiscountedUnitPrice < @CalculatedPrice SET @CalculatedPrice = @DiscountedUnitPrice; @@ -3240,35 +3240,35 @@ BEGIN OrderID int PRIMARY KEY ); END; -GO +GO IF NOT EXISTS (SELECT 1 FROM sys.table_types WHERE name = N'OrderList') BEGIN CREATE TYPE Website.OrderList AS TABLE ( OrderReference int PRIMARY KEY, - CustomerID int, - ContactPersonID int, - ExpectedDeliveryDate date, - CustomerPurchaseOrderNumber nvarchar(20), - IsUndersupplyBackordered bit, - Comments nvarchar(max), + CustomerID int, + ContactPersonID int, + ExpectedDeliveryDate date, + CustomerPurchaseOrderNumber nvarchar(20), + IsUndersupplyBackordered bit, + Comments nvarchar(max), DeliveryInstructions nvarchar(max) ); END; -GO +GO IF NOT EXISTS (SELECT 1 FROM sys.table_types WHERE name = N'OrderLineList') BEGIN CREATE TYPE Website.OrderLineList AS TABLE ( OrderReference int, - StockItemID int, - [Description] nvarchar(100), + StockItemID int, + [Description] nvarchar(100), Quantity int ); END; -GO +GO IF NOT EXISTS (SELECT 1 FROM sys.table_types WHERE name = N'SensorDataList') BEGIN @@ -3290,12 +3290,12 @@ CREATE PROCEDURE Website.InvoiceCustomerOrders @PackedByPersonID int, @InvoicedByPersonID int WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @InvoicesToGenerate TABLE + DECLARE @InvoicesToGenerate TABLE ( OrderID int PRIMARY KEY, InvoiceID int NOT NULL, @@ -3307,8 +3307,8 @@ BEGIN -- Check that all orders exist, have been fully picked, and not already invoiced. Also allocate new invoice numbers. INSERT @InvoicesToGenerate (OrderID, InvoiceID, TotalDryItems, TotalChillerItems) - SELECT oti.OrderID, - NEXT VALUE FOR Sequences.InvoiceID, + SELECT oti.OrderID, + NEXT VALUE FOR Sequences.InvoiceID, COALESCE((SELECT SUM(CASE WHEN si.IsChillerStock <> 0 THEN 0 ELSE 1 END) FROM Sales.OrderLines AS ol INNER JOIN Warehouse.StockItems AS si @@ -3324,7 +3324,7 @@ BEGIN ON oti.OrderID = o.OrderID WHERE NOT EXISTS (SELECT 1 FROM Sales.Invoices AS i WHERE i.OrderID = oti.OrderID) - AND o.PickingCompletedWhen IS NOT NULL; + AND o.PickingCompletedWhen IS NOT NULL; IF EXISTS (SELECT 1 FROM @OrdersToInvoice AS oti WHERE NOT EXISTS (SELECT 1 FROM @InvoicesToGenerate AS itg WHERE itg.OrderID = oti.OrderID)) BEGIN @@ -3334,88 +3334,86 @@ BEGIN BEGIN TRAN; - INSERT Sales.Invoices - (InvoiceID, CustomerID, BillToCustomerID, OrderID, DeliveryMethodID, ContactPersonID, AccountsPersonID, - SalespersonPersonID, PackedByPersonID, InvoiceDate, CustomerPurchaseOrderNumber, - IsCreditNote, CreditNoteReason, Comments, DeliveryInstructions, InternalComments, - TotalDryItems, TotalChillerItems, DeliveryRun, RunPosition, - ReturnedDeliveryData, + INSERT Sales.Invoices + (InvoiceID, CustomerID, BillToCustomerID, OrderID, DeliveryMethodID, ContactPersonID, AccountsPersonID, + SalespersonPersonID, PackedByPersonID, InvoiceDate, CustomerPurchaseOrderNumber, + IsCreditNote, CreditNoteReason, Comments, DeliveryInstructions, InternalComments, + TotalDryItems, TotalChillerItems, DeliveryRun, RunPosition, + ReturnedDeliveryData, LastEditedBy, LastEditedWhen) SELECT itg.InvoiceID, c.CustomerID, c.BillToCustomerID, itg.OrderID, c.DeliveryMethodID, o.ContactPersonID, btc.PrimaryContactPersonID, o.SalespersonPersonID, @PackedByPersonID, SYSDATETIME(), o.CustomerPurchaseOrderNumber, 0, NULL, NULL, c.DeliveryAddressLine1 + N', ' + c.DeliveryAddressLine2, NULL, - itg.TotalDryItems, itg.TotalChillerItems, c.DeliveryRun, c.RunPosition, - JSON_MODIFY(N'{"Events": []}', N'append $.Events', - JSON_MODIFY(JSON_MODIFY(JSON_MODIFY(N'{ }', N'$.Event', N'Ready for collection'), + itg.TotalDryItems, itg.TotalChillerItems, c.DeliveryRun, c.RunPosition, + JSON_MODIFY(N'{"Events": []}', N'append $.Events', + JSON_MODIFY(JSON_MODIFY(JSON_MODIFY(N'{ }', N'$.Event', N'Ready for collection'), N'$.EventTime', CONVERT(nvarchar(20), SYSDATETIME(), 126)), - N'$.ConNote', N'EAN-125-' + CAST(itg.InvoiceID + 1050 AS nvarchar(20)))), - @InvoicedByPersonID, SYSDATETIME() + N'$.ConNote', N'EAN-125-' + CAST(itg.InvoiceID + 1050 AS nvarchar(20)))), + @InvoicedByPersonID, SYSDATETIME() FROM @InvoicesToGenerate AS itg INNER JOIN Sales.Orders AS o - ON itg.OrderID = o.OrderID + ON itg.OrderID = o.OrderID INNER JOIN Sales.Customers AS c ON o.CustomerID = c.CustomerID INNER JOIN Sales.Customers AS btc ON btc.CustomerID = c.BillToCustomerID; - INSERT Sales.InvoiceLines - (InvoiceID, StockItemID, [Description], PackageTypeID, - Quantity, UnitPrice, TaxRate, TaxAmount, LineProfit, ExtendedPrice, + INSERT Sales.InvoiceLines + (InvoiceID, StockItemID, [Description], PackageTypeID, + Quantity, UnitPrice, TaxRate, TaxAmount, LineProfit, ExtendedPrice, LastEditedBy, LastEditedWhen) SELECT itg.InvoiceID, ol.StockItemID, ol.[Description], ol.PackageTypeID, - ol.PickedQuantity, ol.UnitPrice, ol.TaxRate, + ol.PickedQuantity, ol.UnitPrice, ol.TaxRate, ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2), ROUND(ol.PickedQuantity * (ol.UnitPrice - sih.LastCostPrice), 2), ROUND(ol.PickedQuantity * ol.UnitPrice, 2) + ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2), - @InvoicedByPersonID, SYSDATETIME() + @InvoicedByPersonID, SYSDATETIME() FROM @InvoicesToGenerate AS itg INNER JOIN Sales.OrderLines AS ol - ON itg.OrderID = ol.OrderID + ON itg.OrderID = ol.OrderID INNER JOIN Warehouse.StockItems AS si ON ol.StockItemID = si.StockItemID INNER JOIN Warehouse.StockItemHoldings AS sih - ON si.StockItemID = sih.StockItemID - ORDER BY ol.OrderID, ol.OrderLineID; + ON si.StockItemID = sih.StockItemID; INSERT Warehouse.StockItemTransactions - (StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID, + (StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID, TransactionOccurredWhen, Quantity, LastEditedBy, LastEditedWhen) SELECT il.StockItemID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N'Stock Issue'), i.CustomerID, i.InvoiceID, NULL, NULL, - SYSDATETIME(), 0 - il.Quantity, @InvoicedByPersonID, SYSDATETIME() + SYSDATETIME(), 0 - il.Quantity, @InvoicedByPersonID, SYSDATETIME() FROM @InvoicesToGenerate AS itg INNER JOIN Sales.InvoiceLines AS il - ON itg.InvoiceID = il.InvoiceID + ON itg.InvoiceID = il.InvoiceID INNER JOIN Sales.Invoices AS i - ON il.InvoiceID = i.InvoiceID - ORDER BY il.InvoiceID, il.InvoiceLineID; + ON il.InvoiceID = i.InvoiceID; WITH StockItemTotals AS ( - SELECT il.StockItemID, SUM(il.Quantity) AS TotalQuantity - FROM Sales.InvoiceLines aS il - WHERE il.InvoiceID IN (SELECT InvoiceID FROM @InvoicesToGenerate) - GROUP BY il.StockItemID + SELECT il.StockItemID, SUM(il.Quantity) AS TotalQuantity + FROM Sales.InvoiceLines aS il + WHERE il.InvoiceID IN (SELECT InvoiceID FROM @InvoicesToGenerate) + GROUP BY il.StockItemID ) UPDATE sih SET sih.QuantityOnHand -= sit.TotalQuantity, sih.LastEditedBy = @InvoicedByPersonID, - sih.LastEditedWhen = SYSDATETIME() + sih.LastEditedWhen = SYSDATETIME() FROM Warehouse.StockItemHoldings AS sih - INNER JOIN StockItemTotals AS sit + INNER JOIN StockItemTotals AS sit ON sih.StockItemID = sit.StockItemID; - INSERT Sales.CustomerTransactions - (CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID, - TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount, + INSERT Sales.CustomerTransactions + (CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID, + TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount, OutstandingBalance, FinalizationDate, LastEditedBy, LastEditedWhen) - SELECT i.BillToCustomerID, + SELECT i.BillToCustomerID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N'Customer Invoice'), itg.InvoiceID, NULL, - SYSDATETIME(), + SYSDATETIME(), (SELECT SUM(il.ExtendedPrice - il.TaxAmount) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID), (SELECT SUM(il.TaxAmount) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID), (SELECT SUM(il.ExtendedPrice) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID), @@ -3423,12 +3421,12 @@ BEGIN NULL, @InvoicedByPersonID, SYSDATETIME() - FROM @InvoicesToGenerate AS itg + FROM @InvoicesToGenerate AS itg INNER JOIN Sales.Invoices AS i - ON itg.InvoiceID = i.InvoiceID; + ON itg.InvoiceID = i.InvoiceID; COMMIT; - + END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK; @@ -3452,7 +3450,7 @@ BEGIN SET XACT_ABORT ON; BEGIN TRY - + BEGIN TRAN; DECLARE @NumberOfReadings int = (SELECT MAX(SensorDataListID) FROM @SensorReadings); @@ -3468,18 +3466,18 @@ BEGIN BEGIN SELECT @ColdRoomSensorNumber = ColdRoomSensorNumber, @RecordedWhen = RecordedWhen, - @Temperature = Temperature - FROM @SensorReadings + @Temperature = Temperature + FROM @SensorReadings WHERE SensorDataListID = @Counter; - UPDATE Warehouse.ColdRoomTemperatures + UPDATE Warehouse.ColdRoomTemperatures SET RecordedWhen = @RecordedWhen, - Temperature = @Temperature + Temperature = @Temperature WHERE ColdRoomSensorNumber = @ColdRoomSensorNumber; IF @@ROWCOUNT = 0 BEGIN - INSERT Warehouse.ColdRoomTemperatures + INSERT Warehouse.ColdRoomTemperatures (ColdRoomSensorNumber, RecordedWhen, Temperature) VALUES (@ColdRoomSensorNumber, @RecordedWhen, @Temperature); END; @@ -3492,7 +3490,7 @@ BEGIN END TRY BEGIN CATCH THROW 51000, N'Unable to apply the sensor data', 2; - + IF XACT_STATE() <> 0 ROLLBACK TRAN; RETURN 1; @@ -3509,7 +3507,7 @@ CREATE PROCEDURE Website.InsertCustomerOrders @OrdersCreatedByPersonID int, @SalespersonPersonID int WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -3527,12 +3525,12 @@ BEGIN FROM @Orders; BEGIN TRY - + BEGIN TRAN; - INSERT Sales.Orders - (OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, OrderDate, - ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, Comments, DeliveryInstructions, InternalComments, + INSERT Sales.Orders + (OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, OrderDate, + ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, Comments, DeliveryInstructions, InternalComments, PickingCompletedWhen, LastEditedBy, LastEditedWhen) SELECT otg.OrderID, o.CustomerID, @SalespersonPersonID, NULL, o.ContactPersonID, NULL, SYSDATETIME(), o.ExpectedDeliveryDate, o.CustomerPurchaseOrderNumber, o.IsUndersupplyBackordered, o.Comments, o.DeliveryInstructions, NULL, @@ -3541,8 +3539,8 @@ BEGIN INNER JOIN @Orders AS o ON otg.OrderReference = o.OrderReference; - INSERT Sales.OrderLines - (OrderID, StockItemID, [Description], PackageTypeID, Quantity, UnitPrice, + INSERT Sales.OrderLines + (OrderID, StockItemID, [Description], PackageTypeID, Quantity, UnitPrice, TaxRate, PickedQuantity, PickingCompletedWhen, LastEditedBy, LastEditedWhen) SELECT otg.OrderID, ol.StockItemID, ol.[Description], si.UnitPackageID, ol.Quantity, Website.CalculateCustomerPrice(o.CustomerID, ol.StockItemID, SYSDATETIME()), @@ -3556,7 +3554,7 @@ BEGIN ON ol.StockItemID = si.StockItemID; COMMIT; - + END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK; @@ -3585,36 +3583,36 @@ BEGIN SET @SQL = N'DROP SECURITY POLICY IF EXISTS [Application].FilterCustomersBySalesTerritoryRole;'; EXECUTE (@SQL); - + SET @SQL = N'DROP FUNCTION IF EXISTS [Application].DetermineCustomerAccess;'; EXECUTE (@SQL); - + SET @SQL = N' CREATE FUNCTION [Application].DetermineCustomerAccess(@CityID int) RETURNS TABLE -WITH SCHEMABINDING -AS -RETURN (SELECT 1 AS AccessResult - WHERE IS_ROLEMEMBER(N''db_owner'') <> 0 - OR IS_ROLEMEMBER((SELECT sp.SalesTerritory +WITH SCHEMABINDING +AS +RETURN (SELECT 1 AS AccessResult + WHERE IS_ROLEMEMBER(N''db_owner'') <> 0 + OR IS_ROLEMEMBER((SELECT sp.SalesTerritory FROM [Application].Cities AS c INNER JOIN [Application].StateProvinces AS sp ON c.StateProvinceID = sp.StateProvinceID WHERE c.CityID = @CityID) + N'' Sales'') <> 0 - OR (ORIGINAL_LOGIN() = N''Website'' - AND EXISTS (SELECT 1 + OR (ORIGINAL_LOGIN() = N''Website'' + AND EXISTS (SELECT 1 FROM [Application].Cities AS c INNER JOIN [Application].StateProvinces AS sp ON c.StateProvinceID = sp.StateProvinceID - WHERE c.CityID = @CityID + WHERE c.CityID = @CityID AND sp.SalesTerritory = SESSION_CONTEXT(N''SalesTerritory''))));'; EXECUTE (@SQL); SET @SQL = N' CREATE SECURITY POLICY [Application].FilterCustomersBySalesTerritoryRole -ADD FILTER PREDICATE [Application].DetermineCustomerAccess(DeliveryCityID) +ADD FILTER PREDICATE [Application].DetermineCustomerAccess(DeliveryCityID) ON Sales.Customers, -ADD BLOCK PREDICATE [Application].DetermineCustomerAccess(DeliveryCityID) +ADD BLOCK PREDICATE [Application].DetermineCustomerAccess(DeliveryCityID) ON Sales.Customers AFTER UPDATE;'; EXECUTE (@SQL); @@ -3640,7 +3638,7 @@ BEGIN DECLARE @AreDatabaseAuditSpecificationsSupported bit = 0; DECLARE @SQL nvarchar(max); - -- TODO !! - currently no separate test for audit + -- TODO !! - currently no separate test for audit -- but same editions with XTP support database audit specs IF SERVERPROPERTY(N'IsXTPSupported') <> 0 SET @AreDatabaseAuditSpecificationsSupported = 1; @@ -3649,12 +3647,12 @@ BEGIN IF NOT EXISTS (SELECT 1 FROM sys.server_audits WHERE name = N'WWI_Audit') BEGIN SET @SQL = N' -USE master; +USE master; CREATE SERVER AUDIT [WWI_Audit] TO APPLICATION_LOG WITH -( +( QUEUE_DELAY = 1000, ON_FAILURE = CONTINUE );'; @@ -3721,7 +3719,7 @@ BEGIN DECLARE @AreDatabaseAuditSpecificationsSupported bit = 0; DECLARE @SQL nvarchar(max); - -- TODO !! - currently no separate test for audit + -- TODO !! - currently no separate test for audit -- but same editions with XTP support database audit specs IF SERVERPROPERTY(N'IsXTPSupported') <> 0 SET @AreDatabaseAuditSpecificationsSupported = 1; @@ -3749,7 +3747,7 @@ DROP SERVER AUDIT SPECIFICATION WWI_ServerAuditSpecification;'; IF EXISTS (SELECT 1 FROM sys.server_audits WHERE name = N'WWI_Audit') BEGIN SET @SQL = N' -USE master; +USE master; DROP SERVER AUDIT [WWI_Audit];'; EXECUTE (@SQL); @@ -3785,8 +3783,8 @@ BEGIN DECLARE @CurrentMaximumDate date = COALESCE((SELECT MAX(OrderDate) FROM Sales.Orders), '20121231'); DECLARE @StartingDate date = DATEADD(day, 1, @CurrentMaximumDate); DECLARE @EndingDate date = CAST(DATEADD(day, -1, SYSDATETIME()) AS date); - - EXEC DataLoadSimulation.DailyProcessToCreateHistory + + EXEC DataLoadSimulation.DailyProcessToCreateHistory @StartDate = @StartingDate, @EndDate = @EndingDate, @AverageNumberOfCustomerOrdersPerDay = @AverageNumberOfCustomerOrdersPerDay, @@ -3810,15 +3808,24 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - IF SERVERPROPERTY(N'IsXTPSupported') = 0 -- TODO !! - currently no separate test for columnstore + IF SERVERPROPERTY(N'IsXTPSupported') = 0 -- TODO !! - currently no separate test for columnstore BEGIN -- but same editions with XTP support columnstore PRINT N'Warning: Columnstore indexes cannot be created on this edition.'; END ELSE BEGIN -- if columnstore can be created DECLARE @SQL nvarchar(max) = N''; BEGIN TRY; + BEGIN TRAN; + -- enable page compression on archive tables + SET @SQL = N'' + SELECT @SQL +=N' +ALTER INDEX [' + i.name + N'] ON [' + schema_name(o.schema_id) + N'].[' + o.name + N'] REBUILD PARTITION = ALL WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION = PAGE); ' + FROM sys.indexes i JOIN sys.tables o ON i.object_id=o.object_id + WHERE o.temporal_type = 1 AND i.type=1 + EXECUTE (@SQL); + IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'NCCX_Sales_OrderLines') BEGIN SET @SQL = N' @@ -3856,12 +3863,12 @@ ON Sales.InvoiceLines IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'CCX_Warehouse_StockItemTransactions') BEGIN SET @SQL = N' -ALTER TABLE Warehouse.StockItemTransactions +ALTER TABLE Warehouse.StockItemTransactions DROP CONSTRAINT PK_Warehouse_StockItemTransactions;'; EXECUTE (@SQL); SET @SQL = N' -ALTER TABLE Warehouse.StockItemTransactions +ALTER TABLE Warehouse.StockItemTransactions ADD CONSTRAINT PK_Warehouse_StockItemTransactions PRIMARY KEY NONCLUSTERED (StockItemTransactionID);'; EXECUTE (@SQL); @@ -3898,9 +3905,9 @@ AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - - IF SERVERPROPERTY(N'IsXTPSupported') = 0 - BEGIN + + IF SERVERPROPERTY(N'IsXTPSupported') = 0 + BEGIN PRINT N'Warning: In-memory tables cannot be created on this edition.'; END ELSE BEGIN -- if in-memory can be created @@ -3909,27 +3916,25 @@ BEGIN BEGIN TRY IF CAST(SERVERPROPERTY(N'EngineEdition') AS int) <> 5 -- Not an Azure SQL DB BEGIN - DECLARE @SQLDataFolder nvarchar(max) = (SELECT SUBSTRING(df.physical_name, 1, CHARINDEX(N'WideWorldImporters.mdf', df.physical_name, 1) - 1) - FROM sys.database_files AS df - WHERE df.file_id = 1); + DECLARE @SQLDataFolder nvarchar(max) = CAST(SERVERPROPERTY('InstanceDefaultDataPath') AS nvarchar(max)); DECLARE @MemoryOptimizedFilegroupFolder nvarchar(max) = @SQLDataFolder + N'WideWorldImporters_InMemory_Data_1'; IF NOT EXISTS (SELECT 1 FROM sys.filegroups WHERE name = N'WWI_InMemory_Data') BEGIN SET @SQL = N' -ALTER DATABASE WideWorldImporters +ALTER DATABASE WideWorldImporters ADD FILEGROUP WWI_InMemory_Data CONTAINS MEMORY_OPTIMIZED_DATA;'; EXECUTE (@SQL); SET @SQL = N' ALTER DATABASE WideWorldImporters ADD FILE (name = N''WWI_InMemory_Data_1'', filename = ''' - + @MemoryOptimizedFilegroupFolder + N''') + + @MemoryOptimizedFilegroupFolder + N''') TO FILEGROUP WWI_InMemory_Data;'; EXECUTE (@SQL); SET @SQL = N' -ALTER DATABASE WideWorldImporters +ALTER DATABASE WideWorldImporters SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;'; EXECUTE (@SQL); END; @@ -3945,50 +3950,50 @@ ALTER TABLE Warehouse.ColdRoomTemperatures DROP CONSTRAINT PK_Warehouse_ColdRoom EXECUTE (@SQL); SET @SQL = N' -EXEC dbo.sp_rename @objname = N''Warehouse.ColdRoomTemperatures'', - @newname = N''ColdRoomTemperatures_Backup'', +EXEC dbo.sp_rename @objname = N''Warehouse.ColdRoomTemperatures'', + @newname = N''ColdRoomTemperatures_Backup'', @objtype = N''OBJECT'';'; EXECUTE (@SQL); SET @SQL = N' CREATE TABLE Warehouse.ColdRoomTemperatures ( - ColdRoomTemperatureID bigint IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + ColdRoomTemperatureID bigint IDENTITY(1,1) NOT NULL, ColdRoomSensorNumber int NOT NULL, RecordedWhen datetime2(7) NOT NULL, Temperature decimal(10, 2) NOT NULL, ValidFrom datetime2(7) NOT NULL, - ValidTo datetime2(7) NOT NULL + ValidTo datetime2(7) NOT NULL, + CONSTRAINT PK_Warehouse_ColdRoomTemperatures PRIMARY KEY NONCLUSTERED (ColdRoomTemperatureID) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_AND_DATA);'; EXECUTE (@SQL); SET @SQL = N' -SET IDENTITY_INSERT Warehouse.ColdRoomTemperatures ON; +SET IDENTITY_INSERT Warehouse.ColdRoomTemperatures ON; -INSERT Warehouse.ColdRoomTemperatures (ColdRoomTemperatureID, ColdRoomSensorNumber, RecordedWhen, Temperature, - ValidFrom, ValidTo) -SELECT ColdRoomTemperatureID, ColdRoomSensorNumber, RecordedWhen, Temperature, ValidFrom, ValidTo -FROM Warehouse.ColdRoomTemperatures_Backup; +INSERT Warehouse.ColdRoomTemperatures (ColdRoomTemperatureID, ColdRoomSensorNumber, RecordedWhen, Temperature, + ValidFrom, ValidTo) +SELECT ColdRoomTemperatureID, ColdRoomSensorNumber, RecordedWhen, Temperature, ValidFrom, ValidTo +FROM Warehouse.ColdRoomTemperatures_Backup; SET IDENTITY_INSERT Warehouse.ColdRoomTemperatures OFF;'; - EXECUTE (@SQL); + EXECUTE (@SQL); SET @SQL = N'DROP TABLE Warehouse.ColdRoomTemperatures_Backup;'; EXECUTE (@SQL); SET @SQL = N' -ALTER TABLE Warehouse.ColdRoomTemperatures +ALTER TABLE Warehouse.ColdRoomTemperatures ADD PERIOD FOR SYSTEM_TIME(ValidFrom, ValidTo);'; EXECUTE (@SQL); SET @SQL = N' -ALTER TABLE Warehouse.ColdRoomTemperatures +ALTER TABLE Warehouse.ColdRoomTemperatures SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = Warehouse.ColdRoomTemperatures_Archive, DATA_CONSISTENCY_CHECK = ON));'; EXECUTE (@SQL); END; -- of if we need to move ColdRoomTemperatures - + IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = N'VehicleTemperatures' AND is_memory_optimized <> 0) BEGIN @@ -3997,8 +4002,8 @@ ALTER TABLE Warehouse.VehicleTemperatures DROP CONSTRAINT PK_Warehouse_VehicleTe EXECUTE (@SQL); SET @SQL = N' -EXEC dbo.sp_rename @objname = N''Warehouse.VehicleTemperatures'', - @newname = N''VehicleTemperatures_Backup'', +EXEC dbo.sp_rename @objname = N''Warehouse.VehicleTemperatures'', + @newname = N''VehicleTemperatures_Backup'', @objtype = N''OBJECT'';'; EXECUTE (@SQL); @@ -4013,20 +4018,21 @@ CREATE TABLE Warehouse.VehicleTemperatures Temperature decimal(10, 2) NOT NULL, FullSensorData nvarchar(1000) COLLATE Latin1_General_CI_AS NULL, IsCompressed bit NOT NULL, - CompressedSensorData varbinary(max) NULL + CompressedSensorData varbinary(max) NULL, + CONSTRAINT PK_Warehouse_VehicleTemperatures PRIMARY KEY NONCLUSTERED (VehicleTemperatureID) ) WITH (MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA);'; EXECUTE (@SQL); SET @SQL = N' -SET IDENTITY_INSERT Warehouse.VehicleTemperatures ON; +SET IDENTITY_INSERT Warehouse.VehicleTemperatures ON; -INSERT Warehouse.VehicleTemperatures - (VehicleTemperatureID, VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature, FullSensorData, IsCompressed, CompressedSensorData) +INSERT Warehouse.VehicleTemperatures + (VehicleTemperatureID, VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature, FullSensorData, IsCompressed, CompressedSensorData) SELECT VehicleTemperatureID, VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature, FullSensorData, IsCompressed, CompressedSensorData -FROM Warehouse.VehicleTemperatures_Backup; +FROM Warehouse.VehicleTemperatures_Backup; -SET IDENTITY_INSERT Warehouse.VehicleTemperatures OFF;'; - EXECUTE (@SQL); +SET IDENTITY_INSERT Warehouse.VehicleTemperatures OFF;'; + EXECUTE (@SQL); SET @SQL = N'DROP TABLE Warehouse.VehicleTemperatures_Backup;'; EXECUTE (@SQL); @@ -4036,22 +4042,22 @@ SET IDENTITY_INSERT Warehouse.VehicleTemperatures OFF;'; -- Drop the procedures that are used by the table types SET @SQL = N'DROP PROCEDURE IF EXISTS Website.InvoiceCustomerOrders;'; - EXECUTE (@SQL); + EXECUTE (@SQL); SET @SQL = N'DROP PROCEDURE IF EXISTS Website.InsertCustomerOrders;'; - EXECUTE (@SQL); + EXECUTE (@SQL); SET @SQL = N'DROP PROCEDURE IF EXISTS Website.RecordColdRoomTemperatures;'; EXECUTE (@SQL); -- Drop the table types SET @SQL = N'DROP TYPE IF EXISTS Website.OrderIDList;'; - EXECUTE (@SQL); + EXECUTE (@SQL); SET @SQL = N'DROP TYPE IF EXISTS Website.OrderLineList;'; - EXECUTE (@SQL); + EXECUTE (@SQL); SET @SQL = N'DROP TYPE IF EXISTS Website.OrderList;'; - EXECUTE (@SQL); + EXECUTE (@SQL); SET @SQL = N'DROP TYPE IF EXISTS Website.SensorDataList;'; - EXECUTE (@SQL); + EXECUTE (@SQL); -- Create the new table types @@ -4059,7 +4065,7 @@ SET IDENTITY_INSERT Warehouse.VehicleTemperatures OFF;'; CREATE TYPE Website.OrderIDList AS TABLE ( OrderID int PRIMARY KEY NONCLUSTERED -) +) WITH (MEMORY_OPTIMIZED = ON);'; EXECUTE (@SQL); @@ -4067,14 +4073,14 @@ WITH (MEMORY_OPTIMIZED = ON);'; CREATE TYPE Website.OrderList AS TABLE ( OrderReference int PRIMARY KEY NONCLUSTERED, - CustomerID int, - ContactPersonID int, - ExpectedDeliveryDate date, - CustomerPurchaseOrderNumber nvarchar(20), - IsUndersupplyBackordered bit, - Comments nvarchar(max), + CustomerID int, + ContactPersonID int, + ExpectedDeliveryDate date, + CustomerPurchaseOrderNumber nvarchar(20), + IsUndersupplyBackordered bit, + Comments nvarchar(max), DeliveryInstructions nvarchar(max) -) +) WITH (MEMORY_OPTIMIZED = ON);'; EXECUTE (@SQL); @@ -4082,11 +4088,11 @@ WITH (MEMORY_OPTIMIZED = ON);'; CREATE TYPE Website.OrderLineList AS TABLE ( OrderReference int, - StockItemID int, - [Description] nvarchar(100), + StockItemID int, + [Description] nvarchar(100), Quantity int, INDEX IX_Website_OrderLineList NONCLUSTERED (OrderReference) -) +) WITH (MEMORY_OPTIMIZED = ON);'; EXECUTE (@SQL); @@ -4097,7 +4103,7 @@ CREATE TYPE Website.SensorDataList AS TABLE ColdRoomSensorNumber int, RecordedWhen datetime2(7), Temperature decimal(18,2) -) +) WITH (MEMORY_OPTIMIZED = ON);'; EXECUTE (@SQL); @@ -4107,12 +4113,12 @@ CREATE PROCEDURE Website.InvoiceCustomerOrders @PackedByPersonID int, @InvoicedByPersonID int WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @InvoicesToGenerate TABLE + DECLARE @InvoicesToGenerate TABLE ( OrderID int PRIMARY KEY, InvoiceID int NOT NULL, @@ -4124,8 +4130,8 @@ BEGIN -- Check that all orders exist, have been fully picked, and not already invoiced. Also allocate new invoice numbers. INSERT @InvoicesToGenerate (OrderID, InvoiceID, TotalDryItems, TotalChillerItems) - SELECT oti.OrderID, - NEXT VALUE FOR Sequences.InvoiceID, + SELECT oti.OrderID, + NEXT VALUE FOR Sequences.InvoiceID, COALESCE((SELECT SUM(CASE WHEN si.IsChillerStock <> 0 THEN 0 ELSE 1 END) FROM Sales.OrderLines AS ol INNER JOIN Warehouse.StockItems AS si @@ -4141,7 +4147,7 @@ BEGIN ON oti.OrderID = o.OrderID WHERE NOT EXISTS (SELECT 1 FROM Sales.Invoices AS i WHERE i.OrderID = oti.OrderID) - AND o.PickingCompletedWhen IS NOT NULL; + AND o.PickingCompletedWhen IS NOT NULL; IF EXISTS (SELECT 1 FROM @OrdersToInvoice AS oti WHERE NOT EXISTS (SELECT 1 FROM @InvoicesToGenerate AS itg WHERE itg.OrderID = oti.OrderID)) BEGIN @@ -4151,88 +4157,88 @@ BEGIN BEGIN TRAN; - INSERT Sales.Invoices - (InvoiceID, CustomerID, BillToCustomerID, OrderID, DeliveryMethodID, ContactPersonID, AccountsPersonID, - SalespersonPersonID, PackedByPersonID, InvoiceDate, CustomerPurchaseOrderNumber, - IsCreditNote, CreditNoteReason, Comments, DeliveryInstructions, InternalComments, - TotalDryItems, TotalChillerItems, DeliveryRun, RunPosition, - ReturnedDeliveryData, + INSERT Sales.Invoices + (InvoiceID, CustomerID, BillToCustomerID, OrderID, DeliveryMethodID, ContactPersonID, AccountsPersonID, + SalespersonPersonID, PackedByPersonID, InvoiceDate, CustomerPurchaseOrderNumber, + IsCreditNote, CreditNoteReason, Comments, DeliveryInstructions, InternalComments, + TotalDryItems, TotalChillerItems, DeliveryRun, RunPosition, + ReturnedDeliveryData, LastEditedBy, LastEditedWhen) SELECT itg.InvoiceID, c.CustomerID, c.BillToCustomerID, itg.OrderID, c.DeliveryMethodID, o.ContactPersonID, btc.PrimaryContactPersonID, o.SalespersonPersonID, @PackedByPersonID, SYSDATETIME(), o.CustomerPurchaseOrderNumber, 0, NULL, NULL, c.DeliveryAddressLine1 + N'', '' + c.DeliveryAddressLine2, NULL, - itg.TotalDryItems, itg.TotalChillerItems, c.DeliveryRun, c.RunPosition, - JSON_MODIFY(N''{"Events": []}'', N''append $.Events'', - JSON_MODIFY(JSON_MODIFY(JSON_MODIFY(N''{ }'', N''$.Event'', N''Ready for collection''), + itg.TotalDryItems, itg.TotalChillerItems, c.DeliveryRun, c.RunPosition, + JSON_MODIFY(N''{"Events": []}'', N''append $.Events'', + JSON_MODIFY(JSON_MODIFY(JSON_MODIFY(N''{ }'', N''$.Event'', N''Ready for collection''), N''$.EventTime'', CONVERT(nvarchar(20), SYSDATETIME(), 126)), - N''$.ConNote'', N''EAN-125-'' + CAST(itg.InvoiceID + 1050 AS nvarchar(20)))), - @InvoicedByPersonID, SYSDATETIME() + N''$.ConNote'', N''EAN-125-'' + CAST(itg.InvoiceID + 1050 AS nvarchar(20)))), + @InvoicedByPersonID, SYSDATETIME() FROM @InvoicesToGenerate AS itg INNER JOIN Sales.Orders AS o - ON itg.OrderID = o.OrderID + ON itg.OrderID = o.OrderID INNER JOIN Sales.Customers AS c ON o.CustomerID = c.CustomerID INNER JOIN Sales.Customers AS btc ON btc.CustomerID = c.BillToCustomerID; - INSERT Sales.InvoiceLines - (InvoiceID, StockItemID, [Description], PackageTypeID, - Quantity, UnitPrice, TaxRate, TaxAmount, LineProfit, ExtendedPrice, + INSERT Sales.InvoiceLines + (InvoiceID, StockItemID, [Description], PackageTypeID, + Quantity, UnitPrice, TaxRate, TaxAmount, LineProfit, ExtendedPrice, LastEditedBy, LastEditedWhen) SELECT itg.InvoiceID, ol.StockItemID, ol.[Description], ol.PackageTypeID, - ol.PickedQuantity, ol.UnitPrice, ol.TaxRate, + ol.PickedQuantity, ol.UnitPrice, ol.TaxRate, ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2), ROUND(ol.PickedQuantity * (ol.UnitPrice - sih.LastCostPrice), 2), ROUND(ol.PickedQuantity * ol.UnitPrice, 2) + ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2), - @InvoicedByPersonID, SYSDATETIME() + @InvoicedByPersonID, SYSDATETIME() FROM @InvoicesToGenerate AS itg INNER JOIN Sales.OrderLines AS ol - ON itg.OrderID = ol.OrderID + ON itg.OrderID = ol.OrderID INNER JOIN Warehouse.StockItems AS si ON ol.StockItemID = si.StockItemID INNER JOIN Warehouse.StockItemHoldings AS sih ON si.StockItemID = sih.StockItemID - ORDER BY ol.OrderID, ol.OrderLineID; + ORDER BY ol.OrderID, ol.OrderLineID; INSERT Warehouse.StockItemTransactions - (StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID, + (StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID, TransactionOccurredWhen, Quantity, LastEditedBy, LastEditedWhen) SELECT il.StockItemID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Stock Issue''), i.CustomerID, i.InvoiceID, NULL, NULL, - SYSDATETIME(), 0 - il.Quantity, @InvoicedByPersonID, SYSDATETIME() + SYSDATETIME(), 0 - il.Quantity, @InvoicedByPersonID, SYSDATETIME() FROM @InvoicesToGenerate AS itg INNER JOIN Sales.InvoiceLines AS il - ON itg.InvoiceID = il.InvoiceID + ON itg.InvoiceID = il.InvoiceID INNER JOIN Sales.Invoices AS i - ON il.InvoiceID = i.InvoiceID + ON il.InvoiceID = i.InvoiceID ORDER BY il.InvoiceID, il.InvoiceLineID; WITH StockItemTotals AS ( - SELECT il.StockItemID, SUM(il.Quantity) AS TotalQuantity - FROM Sales.InvoiceLines aS il - WHERE il.InvoiceID IN (SELECT InvoiceID FROM @InvoicesToGenerate) - GROUP BY il.StockItemID + SELECT il.StockItemID, SUM(il.Quantity) AS TotalQuantity + FROM Sales.InvoiceLines aS il + WHERE il.InvoiceID IN (SELECT InvoiceID FROM @InvoicesToGenerate) + GROUP BY il.StockItemID ) UPDATE sih SET sih.QuantityOnHand -= sit.TotalQuantity, sih.LastEditedBy = @InvoicedByPersonID, - sih.LastEditedWhen = SYSDATETIME() + sih.LastEditedWhen = SYSDATETIME() FROM Warehouse.StockItemHoldings AS sih - INNER JOIN StockItemTotals AS sit + INNER JOIN StockItemTotals AS sit ON sih.StockItemID = sit.StockItemID; - INSERT Sales.CustomerTransactions - (CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID, - TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount, + INSERT Sales.CustomerTransactions + (CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID, + TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount, OutstandingBalance, FinalizationDate, LastEditedBy, LastEditedWhen) - SELECT i.BillToCustomerID, + SELECT i.BillToCustomerID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Customer Invoice''), itg.InvoiceID, NULL, - SYSDATETIME(), + SYSDATETIME(), (SELECT SUM(il.ExtendedPrice - il.TaxAmount) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID), (SELECT SUM(il.TaxAmount) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID), (SELECT SUM(il.ExtendedPrice) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID), @@ -4240,12 +4246,12 @@ BEGIN NULL, @InvoicedByPersonID, SYSDATETIME() - FROM @InvoicesToGenerate AS itg + FROM @InvoicesToGenerate AS itg INNER JOIN Sales.Invoices AS i - ON itg.InvoiceID = i.InvoiceID; + ON itg.InvoiceID = i.InvoiceID; COMMIT; - + END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK; @@ -4269,7 +4275,7 @@ BEGIN ATOMIC WITH LANGUAGE = N''English'' ) BEGIN TRY - + DECLARE @NumberOfReadings int = (SELECT MAX(SensorDataListID) FROM @SensorReadings); DECLARE @Counter int = (SELECT MIN(SensorDataListID) FROM @SensorReadings); @@ -4283,18 +4289,18 @@ BEGIN ATOMIC WITH BEGIN SELECT @ColdRoomSensorNumber = ColdRoomSensorNumber, @RecordedWhen = RecordedWhen, - @Temperature = Temperature - FROM @SensorReadings + @Temperature = Temperature + FROM @SensorReadings WHERE SensorDataListID = @Counter; - UPDATE Warehouse.ColdRoomTemperatures + UPDATE Warehouse.ColdRoomTemperatures SET RecordedWhen = @RecordedWhen, - Temperature = @Temperature + Temperature = @Temperature WHERE ColdRoomSensorNumber = @ColdRoomSensorNumber; IF @@ROWCOUNT = 0 BEGIN - INSERT Warehouse.ColdRoomTemperatures + INSERT Warehouse.ColdRoomTemperatures (ColdRoomSensorNumber, RecordedWhen, Temperature) VALUES (@ColdRoomSensorNumber, @RecordedWhen, @Temperature); END; @@ -4305,7 +4311,7 @@ BEGIN ATOMIC WITH END TRY BEGIN CATCH THROW 51000, N''Unable to apply the sensor data'', 2; - + RETURN 1; END CATCH; END;'; @@ -4318,7 +4324,7 @@ CREATE PROCEDURE Website.InsertCustomerOrders @OrdersCreatedByPersonID int, @SalespersonPersonID int WITH EXECUTE AS OWNER -AS +AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; @@ -4336,12 +4342,12 @@ BEGIN FROM @Orders; BEGIN TRY - + BEGIN TRAN; - INSERT Sales.Orders - (OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, OrderDate, - ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, Comments, DeliveryInstructions, InternalComments, + INSERT Sales.Orders + (OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, OrderDate, + ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, Comments, DeliveryInstructions, InternalComments, PickingCompletedWhen, LastEditedBy, LastEditedWhen) SELECT otg.OrderID, o.CustomerID, @SalespersonPersonID, NULL, o.ContactPersonID, NULL, SYSDATETIME(), o.ExpectedDeliveryDate, o.CustomerPurchaseOrderNumber, o.IsUndersupplyBackordered, o.Comments, o.DeliveryInstructions, NULL, @@ -4350,8 +4356,8 @@ BEGIN INNER JOIN @Orders AS o ON otg.OrderReference = o.OrderReference; - INSERT Sales.OrderLines - (OrderID, StockItemID, [Description], PackageTypeID, Quantity, UnitPrice, + INSERT Sales.OrderLines + (OrderID, StockItemID, [Description], PackageTypeID, Quantity, UnitPrice, TaxRate, PickedQuantity, PickingCompletedWhen, LastEditedBy, LastEditedWhen) SELECT otg.OrderID, ol.StockItemID, ol.[Description], si.UnitPackageID, ol.Quantity, Website.CalculateCustomerPrice(o.CustomerID, ol.StockItemID, SYSDATETIME()), @@ -4365,7 +4371,7 @@ BEGIN ON ol.StockItemID = si.StockItemID; COMMIT; - + END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK; @@ -4411,7 +4417,7 @@ BEGIN SET @SQL = N' CREATE FULLTEXT INDEX ON [Application].People (SearchName, CustomFields, OtherLanguages) -KEY INDEX PK_Application_People +KEY INDEX PK_Application_People WITH CHANGE_TRACKING AUTO;'; EXECUTE (@SQL); END; @@ -4421,7 +4427,7 @@ WITH CHANGE_TRACKING AUTO;'; SET @SQL = N' CREATE FULLTEXT INDEX ON Sales.Customers (CustomerName) -KEY INDEX PK_Sales_Customers +KEY INDEX PK_Sales_Customers WITH CHANGE_TRACKING AUTO;'; EXECUTE (@SQL); END; @@ -4455,8 +4461,8 @@ CREATE PROCEDURE Website.SearchForPeople @MaximumRowsToReturn int AS BEGIN - SELECT p.PersonID, - p.FullName, + SELECT p.PersonID, + p.FullName, p.PreferredName, CASE WHEN p.IsSalesperson <> 0 THEN N''Salesperson'' WHEN p.IsEmployee <> 0 THEN N''Employee'' @@ -4469,11 +4475,11 @@ BEGIN INNER JOIN FREETEXTTABLE([Application].People, SearchName, @SearchText, @MaximumRowsToReturn) AS ft ON p.PersonID = ft.[KEY] LEFT OUTER JOIN Sales.Customers AS c - ON c.PrimaryContactPersonID = p.PersonID + ON c.PrimaryContactPersonID = p.PersonID LEFT OUTER JOIN Purchasing.Suppliers AS sp - ON sp.PrimaryContactPersonID = p.PersonID + ON sp.PrimaryContactPersonID = p.PersonID LEFT OUTER JOIN Purchasing.Suppliers AS sa - ON sa.AlternateContactPersonID = p.PersonID + ON sa.AlternateContactPersonID = p.PersonID ORDER BY ft.[RANK] FOR JSON AUTO, ROOT(N''People''); END;'; @@ -4488,10 +4494,10 @@ CREATE PROCEDURE Website.SearchForSuppliers @MaximumRowsToReturn int AS BEGIN - SELECT s.SupplierID, - s.SupplierName, - c.CityName, - s.PhoneNumber, + SELECT s.SupplierID, + s.SupplierName, + c.CityName, + s.PhoneNumber, s.FaxNumber , p.FullName AS PrimaryContactFullName, p.PreferredName AS PrimaryContactPreferredName @@ -4499,9 +4505,9 @@ BEGIN INNER JOIN FREETEXTTABLE(Purchasing.Suppliers, SupplierName, @SearchText, @MaximumRowsToReturn) AS ft ON s.SupplierID = ft.[KEY] INNER JOIN [Application].Cities AS c - ON s.DeliveryCityID = c.CityID + ON s.DeliveryCityID = c.CityID LEFT OUTER JOIN [Application].People AS p - ON s.PrimaryContactPersonID = p.PersonID + ON s.PrimaryContactPersonID = p.PersonID ORDER BY ft.[RANK] FOR JSON AUTO, ROOT(N''Suppliers''); END;'; @@ -4517,20 +4523,20 @@ CREATE PROCEDURE Website.SearchForCustomers WITH EXECUTE AS OWNER AS BEGIN - SELECT c.CustomerID, - c.CustomerName, - ct.CityName, - c.PhoneNumber, - c.FaxNumber, + SELECT c.CustomerID, + c.CustomerName, + ct.CityName, + c.PhoneNumber, + c.FaxNumber, p.FullName AS PrimaryContactFullName, p.PreferredName AS PrimaryContactPreferredName FROM Sales.Customers AS c INNER JOIN FREETEXTTABLE(Sales.Customers, CustomerName, @SearchText, @MaximumRowsToReturn) AS ft ON c.CustomerID = ft.[KEY] INNER JOIN [Application].Cities AS ct - ON c.DeliveryCityID = ct.CityID + ON c.DeliveryCityID = ct.CityID LEFT OUTER JOIN [Application].People AS p - ON c.PrimaryContactPersonID = p.PersonID + ON c.PrimaryContactPersonID = p.PersonID ORDER BY ft.[RANK] FOR JSON AUTO, ROOT(N''Customers''); END;'; @@ -4546,7 +4552,7 @@ CREATE PROCEDURE Website.SearchForStockItems WITH EXECUTE AS OWNER AS BEGIN - SELECT si.StockItemID, + SELECT si.StockItemID, si.StockItemName FROM Warehouse.StockItems AS si INNER JOIN FREETEXTTABLE(Warehouse.StockItems, SearchDetails, @SearchText, @MaximumRowsToReturn) AS ft @@ -4566,7 +4572,7 @@ CREATE PROCEDURE Website.SearchForStockItemsByTags WITH EXECUTE AS OWNER AS BEGIN - SELECT si.StockItemID, + SELECT si.StockItemID, si.StockItemName FROM Warehouse.StockItems AS si INNER JOIN FREETEXTTABLE(Warehouse.StockItems, Tags, @SearchText, @MaximumRowsToReturn) AS ft @@ -4603,8 +4609,8 @@ BEGIN IF NOT EXISTS (SELECT 1 FROM sys.partition_functions WHERE name = N'PF_TransactionDateTime') BEGIN SET @SQL = N' -CREATE PARTITION FUNCTION PF_TransactionDateTime(datetime) -AS RANGE RIGHT +CREATE PARTITION FUNCTION PF_TransactionDateTime(datetime) +AS RANGE RIGHT FOR VALUES (N''20140101'', N''20150101'', N''20160101'', N''20170101'');'; EXECUTE (@SQL); END; @@ -4612,18 +4618,18 @@ FOR VALUES (N''20140101'', N''20150101'', N''20160101'', N''20170101'');'; IF NOT EXISTS (SELECT 1 FROM sys.partition_functions WHERE name = N'PF_TransactionDate') BEGIN SET @SQL = N' -CREATE PARTITION FUNCTION PF_TransactionDate(date) -AS RANGE RIGHT +CREATE PARTITION FUNCTION PF_TransactionDate(date) +AS RANGE RIGHT FOR VALUES (N''20140101'', N''20150101'', N''20160101'', N''20170101'');'; EXECUTE (@SQL); - END; + END; IF NOT EXISTS (SELECT * FROM sys.partition_schemes WHERE name = N'PS_TransactionDateTime') BEGIN SET @SQL = N' -CREATE PARTITION SCHEME PS_TransactionDateTime -AS PARTITION PF_TransactionDateTime -ALL TO ([PRIMARY]);'; +CREATE PARTITION SCHEME PS_TransactionDateTime +AS PARTITION PF_TransactionDateTime +ALL TO ([USERDATA]);'; EXECUTE (@SQL); END; @@ -4631,28 +4637,28 @@ ALL TO ([PRIMARY]);'; BEGIN SET @SQL = N' CREATE PARTITION SCHEME PS_TransactionDate -AS PARTITION PF_TransactionDate -ALL TO ([PRIMARY]);'; +AS PARTITION PF_TransactionDate +ALL TO ([USERDATA]]);'; EXECUTE (@SQL); - END; + END; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'CX_Sales_CustomerTransactions') BEGIN SET @SQL = N' -ALTER TABLE Sales.CustomerTransactions +ALTER TABLE Sales.CustomerTransactions DROP CONSTRAINT PK_Sales_CustomerTransactions;'; EXECUTE (@SQL); SET @SQL = N' ALTER TABLE Sales.CustomerTransactions -ADD CONSTRAINT PK_Sales_CustomerTransactions PRIMARY KEY NONCLUSTERED +ADD CONSTRAINT PK_Sales_CustomerTransactions PRIMARY KEY NONCLUSTERED ( CustomerTransactionID );'; EXECUTE (@SQL); SET @SQL = N' -CREATE CLUSTERED INDEX CX_Sales_CustomerTransactions +CREATE CLUSTERED INDEX CX_Sales_CustomerTransactions ON Sales.CustomerTransactions ( TransactionDate @@ -4709,25 +4715,25 @@ ON Sales.CustomerTransactions WITH (DROP_EXISTING = ON) ON PS_TransactionDate(TransactionDate);'; EXECUTE (@SQL); - END; + END; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'CX_Purchasing_SupplierTransactions') BEGIN SET @SQL = N' -ALTER TABLE Purchasing.SupplierTransactions +ALTER TABLE Purchasing.SupplierTransactions DROP CONSTRAINT PK_Purchasing_SupplierTransactions;'; EXECUTE (@SQL); SET @SQL = N' ALTER TABLE Purchasing.SupplierTransactions -ADD CONSTRAINT PK_Purchasing_SupplierTransactions PRIMARY KEY NONCLUSTERED +ADD CONSTRAINT PK_Purchasing_SupplierTransactions PRIMARY KEY NONCLUSTERED ( SupplierTransactionID );'; EXECUTE (@SQL); SET @SQL = N' -CREATE CLUSTERED INDEX CX_Purchasing_SupplierTransactions +CREATE CLUSTERED INDEX CX_Purchasing_SupplierTransactions ON Purchasing.SupplierTransactions ( TransactionDate @@ -4806,7 +4812,7 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - UPDATE [Application].People + UPDATE [Application].People SET IsPermittedToLogon = 1, LogonName = @LogonName, HashedPassword = HASHBYTES(N'SHA2_256', @InitialPassword + FullName), @@ -4814,7 +4820,7 @@ BEGIN WHERE PersonID = @PersonID AND PersonID <> 1 AND IsPermittedToLogon = 0; - + IF @@ROWCOUNT = 0 BEGIN PRINT N'The PersonID must be valid, must not be person 1, and must not already be enabled'; @@ -4837,13 +4843,13 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - UPDATE [Application].People + UPDATE [Application].People SET IsPermittedToLogon = 1, HashedPassword = HASHBYTES(N'SHA2_256', @NewPassword + FullName) WHERE PersonID = @PersonID AND PersonID <> 1 AND HashedPassword = HASHBYTES(N'SHA2_256', @OldPassword + FullName); - + IF @@ROWCOUNT = 0 BEGIN PRINT N'The PersonID must be valid, and the old password must be valid.'; @@ -4865,23 +4871,23 @@ SELECT s.SupplierID, pp.FullName AS PrimaryContact, ap.FullName AS AlternateContact, s.PhoneNumber, - s.FaxNumber, + s.FaxNumber, s.WebsiteURL, dm.DeliveryMethodName AS DeliveryMethod, c.CityName AS CityName, s.DeliveryLocation AS DeliveryLocation, s.SupplierReference FROM Purchasing.Suppliers AS s -LEFT OUTER JOIN Purchasing.SupplierCategories AS sc +LEFT OUTER JOIN Purchasing.SupplierCategories AS sc ON s.SupplierCategoryID = sc.SupplierCategoryID LEFT OUTER JOIN [Application].People AS pp -ON s.PrimaryContactPersonID = pp.PersonID +ON s.PrimaryContactPersonID = pp.PersonID LEFT OUTER JOIN [Application].People AS ap -ON s.AlternateContactPersonID = ap.PersonID +ON s.AlternateContactPersonID = ap.PersonID LEFT OUTER JOIN [Application].DeliveryMethods AS dm ON s.DeliveryMethodID = dm.DeliveryMethodID LEFT OUTER JOIN [Application].Cities AS c -ON s.DeliveryCityID = c.CityID +ON s.DeliveryCityID = c.CityID GO DROP VIEW IF EXISTS Website.Customers; @@ -4896,7 +4902,7 @@ SELECT s.CustomerID, ap.FullName AS AlternateContact, s.PhoneNumber, s.FaxNumber, - bg.BuyingGroupName, + bg.BuyingGroupName, s.WebsiteURL, dm.DeliveryMethodName AS DeliveryMethod, c.CityName AS CityName, @@ -4904,18 +4910,18 @@ SELECT s.CustomerID, s.DeliveryRun, s.RunPosition FROM Sales.Customers AS s -LEFT OUTER JOIN Sales.CustomerCategories AS sc +LEFT OUTER JOIN Sales.CustomerCategories AS sc ON s.CustomerCategoryID = sc.CustomerCategoryID LEFT OUTER JOIN [Application].People AS pp -ON s.PrimaryContactPersonID = pp.PersonID +ON s.PrimaryContactPersonID = pp.PersonID LEFT OUTER JOIN [Application].People AS ap -ON s.AlternateContactPersonID = ap.PersonID +ON s.AlternateContactPersonID = ap.PersonID LEFT OUTER JOIN Sales.BuyingGroups AS bg ON s.BuyingGroupID = bg.BuyingGroupID LEFT OUTER JOIN [Application].DeliveryMethods AS dm ON s.DeliveryMethodID = dm.DeliveryMethodID LEFT OUTER JOIN [Application].Cities AS c -ON s.DeliveryCityID = c.CityID +ON s.DeliveryCityID = c.CityID GO DROP VIEW IF EXISTS Website.VehicleTemperatures; @@ -4928,9 +4934,9 @@ SELECT vt.VehicleTemperatureID, vt.ChillerSensorNumber, vt.RecordedWhen, vt.Temperature, - CASE WHEN vt.IsCompressed <> 0 + CASE WHEN vt.IsCompressed <> 0 THEN CAST(DECOMPRESS(vt.CompressedSensorData) AS nvarchar(1000)) - ELSE vt.FullSensorData + ELSE vt.FullSensorData END AS FullSensorData FROM Warehouse.VehicleTemperatures AS vt; GO @@ -4951,10 +4957,10 @@ BEGIN SET @SQL = N'DROP SECURITY POLICY IF EXISTS [Application].FilterCustomersBySalesTerritoryRole;'; EXECUTE (@SQL); - + SET @SQL = N'DROP FUNCTION IF EXISTS [Application].DetermineCustomerAccess;'; EXECUTE (@SQL); - + PRINT N'Successfully removed row level security'; END TRY BEGIN CATCH @@ -5026,124 +5032,124 @@ BEGIN DECLARE CountryChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT co.CountryID, - co.ValidFrom + co.ValidFrom FROM [Application].Countries_Archive AS co - WHERE co.ValidFrom > @LastCutoff - AND co.ValidFrom <= @NewCutoff + WHERE co.ValidFrom > @LastCutoff + AND co.ValidFrom <= @NewCutoff AND co.ValidFrom <> @InitialLoadDate UNION ALL SELECT co.CountryID, - co.ValidFrom + co.ValidFrom FROM [Application].Countries AS co - WHERE co.ValidFrom > @LastCutoff + WHERE co.ValidFrom > @LastCutoff AND co.ValidFrom <= @NewCutoff AND co.ValidFrom <> @InitialLoadDate ORDER BY ValidFrom; OPEN CountryChangeList; FETCH NEXT FROM CountryChangeList INTO @CountryID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #CityChanges + INSERT #CityChanges ([WWI City ID], City, [State Province], Country, Continent, [Sales Territory], Region, Subregion, [Location], [Latest Recorded Population], [Valid From], [Valid To]) SELECT c.CityID, c.CityName, sp.StateProvinceName, co.CountryName, co.Continent, sp.SalesTerritory, co.Region, co.Subregion, - c.[Location], COALESCE(c.LatestRecordedPopulation, 0), @ValidFrom, NULL + c.[Location], COALESCE(c.LatestRecordedPopulation, 0), @ValidFrom, NULL FROM [Application].Cities FOR SYSTEM_TIME AS OF @ValidFrom AS c INNER JOIN [Application].StateProvinces FOR SYSTEM_TIME AS OF @ValidFrom AS sp ON c.StateProvinceID = sp.StateProvinceID INNER JOIN [Application].Countries FOR SYSTEM_TIME AS OF @ValidFrom AS co - ON sp.CountryID = co.CountryID + ON sp.CountryID = co.CountryID WHERE co.CountryID = @CountryID; - + FETCH NEXT FROM CountryChangeList INTO @CountryID, @ValidFrom; END; - + CLOSE CountryChangeList; - DEALLOCATE CountryChangeList; + DEALLOCATE CountryChangeList; -- next need to find any stateprovince changes that have occurred since initial load DECLARE StateProvinceChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT sp.StateProvinceID, - sp.ValidFrom + sp.ValidFrom FROM [Application].StateProvinces_Archive AS sp - WHERE sp.ValidFrom > @LastCutoff - AND sp.ValidFrom <= @NewCutoff + WHERE sp.ValidFrom > @LastCutoff + AND sp.ValidFrom <= @NewCutoff AND sp.ValidFrom <> @InitialLoadDate UNION ALL SELECT sp.StateProvinceID, - sp.ValidFrom + sp.ValidFrom FROM [Application].StateProvinces AS sp - WHERE sp.ValidFrom > @LastCutoff - AND sp.ValidFrom <= @NewCutoff + WHERE sp.ValidFrom > @LastCutoff + AND sp.ValidFrom <= @NewCutoff AND sp.ValidFrom <> @InitialLoadDate ORDER BY ValidFrom; OPEN StateProvinceChangeList; FETCH NEXT FROM StateProvinceChangeList INTO @StateProvinceID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #CityChanges + INSERT #CityChanges ([WWI City ID], City, [State Province], Country, Continent, [Sales Territory], Region, Subregion, [Location], [Latest Recorded Population], [Valid From], [Valid To]) SELECT c.CityID, c.CityName, sp.StateProvinceName, co.CountryName, co.Continent, sp.SalesTerritory, co.Region, co.Subregion, - c.[Location], COALESCE(c.LatestRecordedPopulation, 0), @ValidFrom, NULL + c.[Location], COALESCE(c.LatestRecordedPopulation, 0), @ValidFrom, NULL FROM [Application].Cities FOR SYSTEM_TIME AS OF @ValidFrom AS c INNER JOIN [Application].StateProvinces FOR SYSTEM_TIME AS OF @ValidFrom AS sp ON c.StateProvinceID = sp.StateProvinceID INNER JOIN [Application].Countries FOR SYSTEM_TIME AS OF @ValidFrom AS co - ON sp.CountryID = co.CountryID - WHERE sp.StateProvinceID = @StateProvinceID; - + ON sp.CountryID = co.CountryID + WHERE sp.StateProvinceID = @StateProvinceID; + FETCH NEXT FROM StateProvinceChangeList INTO @StateProvinceID, @ValidFrom; END; - + CLOSE StateProvinceChangeList; - DEALLOCATE StateProvinceChangeList; + DEALLOCATE StateProvinceChangeList; -- finally need to find any city changes that have occurred, including during the initial load DECLARE CityChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT c.CityID, - c.ValidFrom + c.ValidFrom FROM [Application].Cities_Archive AS c - WHERE c.ValidFrom > @LastCutoff - AND c.ValidFrom <= @NewCutoff + WHERE c.ValidFrom > @LastCutoff + AND c.ValidFrom <= @NewCutoff UNION ALL SELECT c.CityID, - c.ValidFrom + c.ValidFrom FROM [Application].Cities AS c - WHERE c.ValidFrom > @LastCutoff - AND c.ValidFrom <= @NewCutoff + WHERE c.ValidFrom > @LastCutoff + AND c.ValidFrom <= @NewCutoff ORDER BY ValidFrom; OPEN CityChangeList; FETCH NEXT FROM CityChangeList INTO @CityID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #CityChanges + INSERT #CityChanges ([WWI City ID], City, [State Province], Country, Continent, [Sales Territory], Region, Subregion, [Location], [Latest Recorded Population], [Valid From], [Valid To]) SELECT c.CityID, c.CityName, sp.StateProvinceName, co.CountryName, co.Continent, sp.SalesTerritory, co.Region, co.Subregion, - c.[Location], COALESCE(c.LatestRecordedPopulation, 0), @ValidFrom, NULL + c.[Location], COALESCE(c.LatestRecordedPopulation, 0), @ValidFrom, NULL FROM [Application].Cities FOR SYSTEM_TIME AS OF @ValidFrom AS c INNER JOIN [Application].StateProvinces FOR SYSTEM_TIME AS OF @ValidFrom AS sp ON c.StateProvinceID = sp.StateProvinceID INNER JOIN [Application].Countries FOR SYSTEM_TIME AS OF @ValidFrom AS co - ON sp.CountryID = co.CountryID - WHERE c.CityID = @CityID; - + ON sp.CountryID = co.CountryID + WHERE c.CityID = @CityID; + FETCH NEXT FROM CityChangeList INTO @CityID, @ValidFrom; END; - + CLOSE CityChangeList; - DEALLOCATE CityChangeList; + DEALLOCATE CityChangeList; -- add an index to make lookups faster @@ -5152,16 +5158,16 @@ BEGIN -- work out the [Valid To] value by taking the [Valid From] of any row that's for the same city but later -- otherwise take the end of time - UPDATE cc - SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #CityChanges AS cc2 - WHERE cc2.[WWI City ID] = cc.[WWI City ID] + UPDATE cc + SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #CityChanges AS cc2 + WHERE cc2.[WWI City ID] = cc.[WWI City ID] AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime) FROM #CityChanges AS cc; SELECT [WWI City ID], City, [State Province], Country, Continent, [Sales Territory], Region, Subregion, [Location] geography, [Latest Recorded Population], [Valid From], [Valid To] - FROM #CityChanges + FROM #CityChanges ORDER BY [Valid From]; DROP TABLE #CityChanges; @@ -5208,32 +5214,32 @@ BEGIN DECLARE BuyingGroupChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT bg.BuyingGroupID, - bg.ValidFrom + bg.ValidFrom FROM Sales.BuyingGroups_Archive AS bg - WHERE bg.ValidFrom > @LastCutoff - AND bg.ValidFrom <= @NewCutoff + WHERE bg.ValidFrom > @LastCutoff + AND bg.ValidFrom <= @NewCutoff AND bg.ValidFrom <> @InitialLoadDate UNION ALL SELECT bg.BuyingGroupID, - bg.ValidFrom + bg.ValidFrom FROM Sales.BuyingGroups AS bg - WHERE bg.ValidFrom > @LastCutoff - AND bg.ValidFrom <= @NewCutoff + WHERE bg.ValidFrom > @LastCutoff + AND bg.ValidFrom <= @NewCutoff AND bg.ValidFrom <> @InitialLoadDate ORDER BY ValidFrom; OPEN BuyingGroupChangeList; FETCH NEXT FROM BuyingGroupChangeList INTO @BuyingGroupID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #CustomerChanges + INSERT #CustomerChanges ([WWI Customer ID], Customer, [Bill To Customer], Category, [Buying Group], [Primary Contact], [Postal Code], [Valid From], [Valid To]) SELECT c.CustomerID, c.CustomerName, bt.CustomerName, cc.CustomerCategoryName, bg.BuyingGroupName, p.FullName, c.DeliveryPostalCode, - c.ValidFrom, c.ValidTo + c.ValidFrom, c.ValidTo FROM Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS c INNER JOIN Sales.BuyingGroups FOR SYSTEM_TIME AS OF @ValidFrom AS bg ON c.BuyingGroupID = bg.BuyingGroupID @@ -5242,46 +5248,46 @@ BEGIN INNER JOIN Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS bt ON c.BillToCustomerID = bt.CustomerID INNER JOIN [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p - ON c.PrimaryContactPersonID = p.PersonID + ON c.PrimaryContactPersonID = p.PersonID WHERE c.BuyingGroupID = @BuyingGroupID; FETCH NEXT FROM BuyingGroupChangeList INTO @BuyingGroupID, @ValidFrom; END; - + CLOSE BuyingGroupChangeList; - DEALLOCATE BuyingGroupChangeList; + DEALLOCATE BuyingGroupChangeList; -- next need to find any customer category changes that have occurred since initial load DECLARE CustomerCategoryChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT cc.CustomerCategoryID, - cc.ValidFrom + cc.ValidFrom FROM Sales.CustomerCategories_Archive AS cc - WHERE cc.ValidFrom > @LastCutoff - AND cc.ValidFrom <= @NewCutoff + WHERE cc.ValidFrom > @LastCutoff + AND cc.ValidFrom <= @NewCutoff AND cc.ValidFrom <> @InitialLoadDate UNION ALL SELECT cc.CustomerCategoryID, - cc.ValidFrom + cc.ValidFrom FROM Sales.CustomerCategories AS cc - WHERE cc.ValidFrom > @LastCutoff - AND cc.ValidFrom <= @NewCutoff + WHERE cc.ValidFrom > @LastCutoff + AND cc.ValidFrom <= @NewCutoff AND cc.ValidFrom <> @InitialLoadDate ORDER BY ValidFrom; OPEN CustomerCategoryChangeList; FETCH NEXT FROM CustomerCategoryChangeList INTO @CustomerCategoryID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #CustomerChanges + INSERT #CustomerChanges ([WWI Customer ID], Customer, [Bill To Customer], Category, [Buying Group], [Primary Contact], [Postal Code], [Valid From], [Valid To]) SELECT c.CustomerID, c.CustomerName, bt.CustomerName, cc.CustomerCategoryName, bg.BuyingGroupName, p.FullName, c.DeliveryPostalCode, - c.ValidFrom, c.ValidTo + c.ValidFrom, c.ValidTo FROM Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS c INNER JOIN Sales.BuyingGroups FOR SYSTEM_TIME AS OF @ValidFrom AS bg ON c.BuyingGroupID = bg.BuyingGroupID @@ -5290,44 +5296,44 @@ BEGIN INNER JOIN Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS bt ON c.BillToCustomerID = bt.CustomerID INNER JOIN [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p - ON c.PrimaryContactPersonID = p.PersonID + ON c.PrimaryContactPersonID = p.PersonID WHERE cc.CustomerCategoryID = @CustomerCategoryID; - + FETCH NEXT FROM CustomerCategoryChangeList INTO @CustomerCategoryID, @ValidFrom; END; - + CLOSE CustomerCategoryChangeList; - DEALLOCATE CustomerCategoryChangeList; + DEALLOCATE CustomerCategoryChangeList; -- finally need to find any customer changes that have occurred, including during the initial load DECLARE CustomerChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT c.CustomerID, - c.ValidFrom + c.ValidFrom FROM Sales.Customers_Archive AS c - WHERE c.ValidFrom > @LastCutoff - AND c.ValidFrom <= @NewCutoff + WHERE c.ValidFrom > @LastCutoff + AND c.ValidFrom <= @NewCutoff UNION ALL SELECT c.CustomerID, - c.ValidFrom + c.ValidFrom FROM Sales.Customers AS c - WHERE c.ValidFrom > @LastCutoff - AND c.ValidFrom <= @NewCutoff + WHERE c.ValidFrom > @LastCutoff + AND c.ValidFrom <= @NewCutoff ORDER BY ValidFrom; OPEN CustomerChangeList; FETCH NEXT FROM CustomerChangeList INTO @CustomerID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #CustomerChanges + INSERT #CustomerChanges ([WWI Customer ID], Customer, [Bill To Customer], Category, [Buying Group], [Primary Contact], [Postal Code], [Valid From], [Valid To]) SELECT c.CustomerID, c.CustomerName, bt.CustomerName, cc.CustomerCategoryName, bg.BuyingGroupName, p.FullName, c.DeliveryPostalCode, - c.ValidFrom, c.ValidTo + c.ValidFrom, c.ValidTo FROM Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS c INNER JOIN Sales.BuyingGroups FOR SYSTEM_TIME AS OF @ValidFrom AS bg ON c.BuyingGroupID = bg.BuyingGroupID @@ -5336,14 +5342,14 @@ BEGIN INNER JOIN Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS bt ON c.BillToCustomerID = bt.CustomerID INNER JOIN [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p - ON c.PrimaryContactPersonID = p.PersonID + ON c.PrimaryContactPersonID = p.PersonID WHERE c.CustomerID = @CustomerID; - + FETCH NEXT FROM CustomerChangeList INTO @CustomerID, @ValidFrom; END; - + CLOSE CustomerChangeList; - DEALLOCATE CustomerChangeList; + DEALLOCATE CustomerChangeList; -- add an index to make lookups faster @@ -5352,16 +5358,16 @@ BEGIN -- work out the [Valid To] value by taking the [Valid From] of any row that's for the same customer but later -- otherwise take the end of time - UPDATE cc - SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #CustomerChanges AS cc2 - WHERE cc2.[WWI Customer ID] = cc.[WWI Customer ID] + UPDATE cc + SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #CustomerChanges AS cc2 + WHERE cc2.[WWI Customer ID] = cc.[WWI Customer ID] AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime) FROM #CustomerChanges AS cc; SELECT [WWI Customer ID], Customer, [Bill To Customer], Category, [Buying Group], [Primary Contact], [Postal Code], [Valid From], [Valid To] - FROM #CustomerChanges + FROM #CustomerChanges ORDER BY [Valid From]; DROP TABLE #CustomerChanges; @@ -5383,16 +5389,15 @@ BEGIN SET XACT_ABORT ON; DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - DECLARE @InitialLoadDate date = '20130101'; CREATE TABLE #EmployeeChanges ( - [WWI Employee ID] int, - Employee nvarchar(50), - [Preferred Name] nvarchar(50), - [Is Salesperson] bit, - Photo varbinary(max), - [Valid From] datetime2(7), + [WWI Employee ID] int, + Employee nvarchar(50), + [Preferred Name] nvarchar(50), + [Is Salesperson] bit, + Photo varbinary(max), + [Valid From] datetime2(7), [Valid To] datetime2(7) ); @@ -5404,38 +5409,38 @@ BEGIN DECLARE EmployeeChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT p.PersonID, - p.ValidFrom + p.ValidFrom FROM [Application].People_Archive AS p - WHERE p.ValidFrom > @LastCutoff - AND p.ValidFrom <= @NewCutoff + WHERE p.ValidFrom > @LastCutoff + AND p.ValidFrom <= @NewCutoff AND p.IsEmployee <> 0 UNION ALL SELECT p.PersonID, - p.ValidFrom + p.ValidFrom FROM [Application].People AS p - WHERE p.ValidFrom > @LastCutoff - AND p.ValidFrom <= @NewCutoff + WHERE p.ValidFrom > @LastCutoff + AND p.ValidFrom <= @NewCutoff AND p.IsEmployee <> 0 ORDER BY ValidFrom; OPEN EmployeeChangeList; FETCH NEXT FROM EmployeeChangeList INTO @PersonID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #EmployeeChanges - ([WWI Employee ID], Employee, [Preferred Name], [Is Salesperson], Photo, + INSERT #EmployeeChanges + ([WWI Employee ID], Employee, [Preferred Name], [Is Salesperson], Photo, [Valid From], [Valid To]) SELECT p.PersonID, p.FullName, p.PreferredName, p.IsSalesperson, p.Photo, p.ValidFrom, p.ValidTo FROM [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p WHERE p.PersonID = @PersonID; - + FETCH NEXT FROM EmployeeChangeList INTO @PersonID, @ValidFrom; END; - + CLOSE EmployeeChangeList; - DEALLOCATE EmployeeChangeList; + DEALLOCATE EmployeeChangeList; -- add an index to make lookups faster @@ -5444,15 +5449,15 @@ BEGIN -- work out the [Valid To] value by taking the [Valid From] of any row that's for the same entry but later -- otherwise take the end of time - UPDATE cc - SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #EmployeeChanges AS cc2 - WHERE cc2.[WWI Employee ID] = cc.[WWI Employee ID] + UPDATE cc + SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #EmployeeChanges AS cc2 + WHERE cc2.[WWI Employee ID] = cc.[WWI Employee ID] AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime) FROM #EmployeeChanges AS cc; - SELECT [WWI Employee ID], Employee, [Preferred Name], [Is Salesperson], Photo, + SELECT [WWI Employee ID], Employee, [Preferred Name], [Is Salesperson], Photo, [Valid From], [Valid To] - FROM #EmployeeChanges + FROM #EmployeeChanges ORDER BY [Valid From]; DROP TABLE #EmployeeChanges; @@ -5474,13 +5479,12 @@ BEGIN SET XACT_ABORT ON; DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - DECLARE @InitialLoadDate date = '20130101'; CREATE TABLE #PaymentMethodChanges ( [WWI Payment Method ID] int, [Payment Method] nvarchar(50), - [Valid From] datetime2(7), + [Valid From] datetime2(7), [Valid To] datetime2(7) ); @@ -5492,34 +5496,34 @@ BEGIN DECLARE ChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT p.PaymentMethodID, - p.ValidFrom + p.ValidFrom FROM [Application].PaymentMethods_Archive AS p - WHERE p.ValidFrom > @LastCutoff - AND p.ValidFrom <= @NewCutoff + WHERE p.ValidFrom > @LastCutoff + AND p.ValidFrom <= @NewCutoff UNION ALL SELECT p.PaymentMethodID, - p.ValidFrom + p.ValidFrom FROM [Application].PaymentMethods AS p - WHERE p.ValidFrom > @LastCutoff - AND p.ValidFrom <= @NewCutoff + WHERE p.ValidFrom > @LastCutoff + AND p.ValidFrom <= @NewCutoff ORDER BY ValidFrom; OPEN ChangeList; FETCH NEXT FROM ChangeList INTO @PaymentMethodID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #PaymentMethodChanges + INSERT #PaymentMethodChanges ([WWI Payment Method ID], [Payment Method], [Valid From], [Valid To]) SELECT p.PaymentMethodID, p.PaymentMethodName, p.ValidFrom, p.ValidTo FROM [Application].PaymentMethods FOR SYSTEM_TIME AS OF @ValidFrom AS p WHERE p.PaymentMethodID = @PaymentMethodID; - + FETCH NEXT FROM ChangeList INTO @PaymentMethodID, @ValidFrom; END; - + CLOSE ChangeList; - DEALLOCATE ChangeList; + DEALLOCATE ChangeList; -- add an index to make lookups faster @@ -5528,14 +5532,14 @@ BEGIN -- work out the [Valid To] value by taking the [Valid From] of any row that's for the same entry but later -- otherwise take the end of time - UPDATE cc - SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #PaymentMethodChanges AS cc2 - WHERE cc2.[WWI Payment Method ID] = cc.[WWI Payment Method ID] + UPDATE cc + SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #PaymentMethodChanges AS cc2 + WHERE cc2.[WWI Payment Method ID] = cc.[WWI Payment Method ID] AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime) FROM #PaymentMethodChanges AS cc; SELECT [WWI Payment Method ID], [Payment Method], [Valid From], [Valid To] - FROM #PaymentMethodChanges + FROM #PaymentMethodChanges ORDER BY [Valid From]; DROP TABLE #PaymentMethodChanges; @@ -5557,27 +5561,26 @@ BEGIN SET XACT_ABORT ON; DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - DECLARE @InitialLoadDate date = '20130101'; CREATE TABLE #StockItemChanges ( - [WWI Stock Item ID] int, - [Stock Item] nvarchar(100), - Color nvarchar(20), - [Selling Package] nvarchar(50), - [Buying Package] nvarchar(50), - Brand nvarchar(50), - Size nvarchar(20), - [Lead Time Days] int, - [Quantity Per Outer] int, - [Is Chiller Stock] bit, - Barcode nvarchar(50), - [Tax Rate] decimal(18,3), - [Unit Price] decimal(18,2), - [Recommended Retail Price] decimal(18,2), - [Typical Weight Per Unit] decimal(18,3), - Photo varbinary(max), - [Valid From] datetime2(7), + [WWI Stock Item ID] int, + [Stock Item] nvarchar(100), + Color nvarchar(20), + [Selling Package] nvarchar(50), + [Buying Package] nvarchar(50), + Brand nvarchar(50), + Size nvarchar(20), + [Lead Time Days] int, + [Quantity Per Outer] int, + [Is Chiller Stock] bit, + Barcode nvarchar(50), + [Tax Rate] decimal(18,3), + [Unit Price] decimal(18,2), + [Recommended Retail Price] decimal(18,2), + [Typical Weight Per Unit] decimal(18,3), + Photo varbinary(max), + [Valid From] datetime2(7), [Valid To] datetime2(7) ); @@ -5589,32 +5592,32 @@ BEGIN DECLARE StockItemChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT c.StockItemID, - c.ValidFrom + c.ValidFrom FROM Warehouse.StockItems_Archive AS c - WHERE c.ValidFrom > @LastCutoff - AND c.ValidFrom <= @NewCutoff + WHERE c.ValidFrom > @LastCutoff + AND c.ValidFrom <= @NewCutoff UNION ALL SELECT c.StockItemID, - c.ValidFrom + c.ValidFrom FROM Warehouse.StockItems AS c - WHERE c.ValidFrom > @LastCutoff - AND c.ValidFrom <= @NewCutoff + WHERE c.ValidFrom > @LastCutoff + AND c.ValidFrom <= @NewCutoff ORDER BY ValidFrom; OPEN StockItemChangeList; FETCH NEXT FROM StockItemChangeList INTO @StockItemID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #StockItemChanges - ([WWI Stock Item ID], [Stock Item], Color, [Selling Package], - [Buying Package], Brand, Size, [Lead Time Days], [Quantity Per Outer], - [Is Chiller Stock], Barcode, [Tax Rate], [Unit Price], [Recommended Retail Price], + INSERT #StockItemChanges + ([WWI Stock Item ID], [Stock Item], Color, [Selling Package], + [Buying Package], Brand, Size, [Lead Time Days], [Quantity Per Outer], + [Is Chiller Stock], Barcode, [Tax Rate], [Unit Price], [Recommended Retail Price], [Typical Weight Per Unit], Photo, [Valid From], [Valid To]) SELECT si.StockItemID, si.StockItemName, c.ColorName, spt.PackageTypeName, bpt.PackageTypeName, si.Brand, si.Size, si.LeadTimeDays, si.QuantityPerOuter, si.IsChillerStock, si.Barcode, si.LeadTimeDays, si.UnitPrice, si.RecommendedRetailPrice, - si.TypicalWeightPerUnit, si.Photo, si.ValidFrom, si.ValidTo + si.TypicalWeightPerUnit, si.Photo, si.ValidFrom, si.ValidTo FROM Warehouse.StockItems FOR SYSTEM_TIME AS OF @ValidFrom AS si INNER JOIN Warehouse.PackageTypes FOR SYSTEM_TIME AS OF @ValidFrom AS spt ON si.UnitPackageID = spt.PackageTypeID @@ -5623,12 +5626,12 @@ BEGIN LEFT OUTER JOIN Warehouse.Colors FOR SYSTEM_TIME AS OF @ValidFrom AS c ON si.ColorID = c.ColorID WHERE si.StockItemID = @StockItemID; - + FETCH NEXT FROM StockItemChangeList INTO @StockItemID, @ValidFrom; END; - + CLOSE StockItemChangeList; - DEALLOCATE StockItemChangeList; + DEALLOCATE StockItemChangeList; -- add an index to make lookups faster @@ -5637,22 +5640,22 @@ BEGIN -- work out the [Valid To] value by taking the [Valid From] of any row that's for the same StockItem but later -- otherwise take the end of time - UPDATE cc - SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #StockItemChanges AS cc2 - WHERE cc2.[WWI Stock Item ID] = cc.[WWI Stock Item ID] + UPDATE cc + SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #StockItemChanges AS cc2 + WHERE cc2.[WWI Stock Item ID] = cc.[WWI Stock Item ID] AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime) FROM #StockItemChanges AS cc; - SELECT [WWI Stock Item ID], [Stock Item], - ISNULL(Color, N'N/A') AS Color, - [Selling Package], [Buying Package], - ISNULL(Brand, N'N/A') AS Brand, - ISNULL(Size, N'N/A') AS Size, - [Lead Time Days], [Quantity Per Outer], [Is Chiller Stock], - ISNULL(Barcode, N'N/A') AS Barcode, - [Tax Rate], [Unit Price], [Recommended Retail Price], [Typical Weight Per Unit], + SELECT [WWI Stock Item ID], [Stock Item], + ISNULL(Color, N'N/A') AS Color, + [Selling Package], [Buying Package], + ISNULL(Brand, N'N/A') AS Brand, + ISNULL(Size, N'N/A') AS Size, + [Lead Time Days], [Quantity Per Outer], [Is Chiller Stock], + ISNULL(Barcode, N'N/A') AS Barcode, + [Tax Rate], [Unit Price], [Recommended Retail Price], [Typical Weight Per Unit], Photo, [Valid From], [Valid To] - FROM #StockItemChanges + FROM #StockItemChanges ORDER BY [Valid From]; DROP TABLE #StockItemChanges; @@ -5698,82 +5701,82 @@ BEGIN DECLARE SupplierCategoryChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT cc.SupplierCategoryID, - cc.ValidFrom + cc.ValidFrom FROM Purchasing.SupplierCategories_Archive AS cc - WHERE cc.ValidFrom > @LastCutoff - AND cc.ValidFrom <= @NewCutoff + WHERE cc.ValidFrom > @LastCutoff + AND cc.ValidFrom <= @NewCutoff AND cc.ValidFrom <> @InitialLoadDate UNION ALL SELECT cc.SupplierCategoryID, - cc.ValidFrom + cc.ValidFrom FROM Purchasing.SupplierCategories AS cc - WHERE cc.ValidFrom > @LastCutoff - AND cc.ValidFrom <= @NewCutoff + WHERE cc.ValidFrom > @LastCutoff + AND cc.ValidFrom <= @NewCutoff AND cc.ValidFrom <> @InitialLoadDate ORDER BY ValidFrom; OPEN SupplierCategoryChangeList; FETCH NEXT FROM SupplierCategoryChangeList INTO @SupplierCategoryID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #SupplierChanges - ([WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference], + INSERT #SupplierChanges + ([WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference], [Payment Days], [Postal Code], [Valid From], [Valid To]) - SELECT s.SupplierID, s.SupplierName, sc.SupplierCategoryName, p.FullName, s.SupplierReference, - s.PaymentDays, s.DeliveryPostalCode, s.ValidFrom, s.ValidTo + SELECT s.SupplierID, s.SupplierName, sc.SupplierCategoryName, p.FullName, s.SupplierReference, + s.PaymentDays, s.DeliveryPostalCode, s.ValidFrom, s.ValidTo FROM Purchasing.Suppliers FOR SYSTEM_TIME AS OF @ValidFrom AS s INNER JOIN Purchasing.SupplierCategories FOR SYSTEM_TIME AS OF @ValidFrom AS sc ON s.SupplierCategoryID = sc.SupplierCategoryID INNER JOIN [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p - ON s.PrimaryContactPersonID = p.PersonID + ON s.PrimaryContactPersonID = p.PersonID WHERE sc.SupplierCategoryID = @SupplierCategoryID; - + FETCH NEXT FROM SupplierCategoryChangeList INTO @SupplierCategoryID, @ValidFrom; END; - + CLOSE SupplierCategoryChangeList; - DEALLOCATE SupplierCategoryChangeList; + DEALLOCATE SupplierCategoryChangeList; -- finally need to find any Supplier changes that have occurred, including during the initial load DECLARE SupplierChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT c.SupplierID, - c.ValidFrom + c.ValidFrom FROM Purchasing.Suppliers_Archive AS c - WHERE c.ValidFrom > @LastCutoff - AND c.ValidFrom <= @NewCutoff + WHERE c.ValidFrom > @LastCutoff + AND c.ValidFrom <= @NewCutoff UNION ALL SELECT c.SupplierID, - c.ValidFrom + c.ValidFrom FROM Purchasing.Suppliers AS c - WHERE c.ValidFrom > @LastCutoff - AND c.ValidFrom <= @NewCutoff + WHERE c.ValidFrom > @LastCutoff + AND c.ValidFrom <= @NewCutoff ORDER BY ValidFrom; OPEN SupplierChangeList; FETCH NEXT FROM SupplierChangeList INTO @SupplierID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #SupplierChanges - ([WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference], + INSERT #SupplierChanges + ([WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference], [Payment Days], [Postal Code], [Valid From], [Valid To]) - SELECT s.SupplierID, s.SupplierName, sc.SupplierCategoryName, p.FullName, s.SupplierReference, - s.PaymentDays, s.DeliveryPostalCode, s.ValidFrom, s.ValidTo + SELECT s.SupplierID, s.SupplierName, sc.SupplierCategoryName, p.FullName, s.SupplierReference, + s.PaymentDays, s.DeliveryPostalCode, s.ValidFrom, s.ValidTo FROM Purchasing.Suppliers FOR SYSTEM_TIME AS OF @ValidFrom AS s INNER JOIN Purchasing.SupplierCategories FOR SYSTEM_TIME AS OF @ValidFrom AS sc ON s.SupplierCategoryID = sc.SupplierCategoryID INNER JOIN [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p - ON s.PrimaryContactPersonID = p.PersonID + ON s.PrimaryContactPersonID = p.PersonID WHERE s.SupplierID = @SupplierID; - + FETCH NEXT FROM SupplierChangeList INTO @SupplierID, @ValidFrom; END; - + CLOSE SupplierChangeList; - DEALLOCATE SupplierChangeList; + DEALLOCATE SupplierChangeList; -- add an index to make lookups faster @@ -5782,16 +5785,16 @@ BEGIN -- work out the [Valid To] value by taking the [Valid From] of any row that's for the same Supplier but later -- otherwise take the end of time - UPDATE cc - SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #SupplierChanges AS cc2 - WHERE cc2.[WWI Supplier ID] = cc.[WWI Supplier ID] + UPDATE cc + SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #SupplierChanges AS cc2 + WHERE cc2.[WWI Supplier ID] = cc.[WWI Supplier ID] AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime) FROM #SupplierChanges AS cc; SELECT [WWI Supplier ID], Supplier, Category, [Primary Contact], - [Supplier Reference], [Payment Days], [Postal Code], + [Supplier Reference], [Payment Days], [Postal Code], [Valid From], [Valid To] - FROM #SupplierChanges + FROM #SupplierChanges ORDER BY [Valid From]; DROP TABLE #SupplierChanges; @@ -5813,13 +5816,12 @@ BEGIN SET XACT_ABORT ON; DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - DECLARE @InitialLoadDate date = '20130101'; CREATE TABLE #TransactionTypeChanges ( [WWI Transaction Type ID] int, [Transaction Type] nvarchar(50), - [Valid From] datetime2(7), + [Valid From] datetime2(7), [Valid To] datetime2(7) ); @@ -5831,34 +5833,34 @@ BEGIN DECLARE ChangeList CURSOR FAST_FORWARD READ_ONLY FOR SELECT tt.TransactionTypeID, - tt.ValidFrom + tt.ValidFrom FROM [Application].TransactionTypes_Archive AS tt - WHERE tt.ValidFrom > @LastCutoff - AND tt.ValidFrom <= @NewCutoff + WHERE tt.ValidFrom > @LastCutoff + AND tt.ValidFrom <= @NewCutoff UNION ALL SELECT tt.TransactionTypeID, - tt.ValidFrom + tt.ValidFrom FROM [Application].TransactionTypes AS tt - WHERE tt.ValidFrom > @LastCutoff - AND tt.ValidFrom <= @NewCutoff + WHERE tt.ValidFrom > @LastCutoff + AND tt.ValidFrom <= @NewCutoff ORDER BY ValidFrom; OPEN ChangeList; FETCH NEXT FROM ChangeList INTO @TransactionTypeID, @ValidFrom; - + WHILE @@FETCH_STATUS = 0 BEGIN - INSERT #TransactionTypeChanges + INSERT #TransactionTypeChanges ([WWI Transaction Type ID], [Transaction Type], [Valid From], [Valid To]) SELECT p.TransactionTypeID, p.TransactionTypeName, p.ValidFrom, p.ValidTo FROM [Application].TransactionTypes FOR SYSTEM_TIME AS OF @ValidFrom AS p WHERE p.TransactionTypeID = @TransactionTypeID; - + FETCH NEXT FROM ChangeList INTO @TransactionTypeID, @ValidFrom; END; - + CLOSE ChangeList; - DEALLOCATE ChangeList; + DEALLOCATE ChangeList; -- add an index to make lookups faster @@ -5867,14 +5869,14 @@ BEGIN -- work out the [Valid To] value by taking the [Valid From] of any row that's for the same entry but later -- otherwise take the end of time - UPDATE cc - SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #TransactionTypeChanges AS cc2 - WHERE cc2.[WWI Transaction Type ID] = cc.[WWI Transaction Type ID] + UPDATE cc + SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #TransactionTypeChanges AS cc2 + WHERE cc2.[WWI Transaction Type ID] = cc.[WWI Transaction Type ID] AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime) FROM #TransactionTypeChanges AS cc; SELECT [WWI Transaction Type ID], [Transaction Type], [Valid From], [Valid To] - FROM #TransactionTypeChanges + FROM #TransactionTypeChanges ORDER BY [Valid From]; DROP TABLE #TransactionTypeChanges; @@ -5895,9 +5897,6 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - DECLARE @InitialLoadDate date = '20130101'; - SELECT CAST(sit.TransactionOccurredWhen AS date) AS [Date Key], sit.StockItemTransactionID AS [WWI Stock Item Transaction ID], sit.InvoiceID AS [WWI Invoice ID], @@ -5909,7 +5908,7 @@ BEGIN sit.TransactionTypeID AS [WWI Transaction Type ID], sit.TransactionOccurredWhen AS [Transaction Occurred When] FROM Warehouse.StockItemTransactions AS sit - WHERE sit.LastEditedWhen > @LastCutoff + WHERE sit.LastEditedWhen > @LastCutoff AND sit.LastEditedWhen <= @NewCutoff ORDER BY sit.StockItemTransactionID; @@ -5929,9 +5928,6 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - DECLARE @InitialLoadDate date = '20130101'; - SELECT CAST(o.OrderDate AS date) AS [Order Date Key], CAST(ol.PickingCompletedWhen AS date) AS [Picked Date Key], @@ -5955,10 +5951,10 @@ BEGIN INNER JOIN Sales.OrderLines AS ol ON o.OrderID = ol.OrderID INNER JOIN Warehouse.PackageTypes AS pt - ON ol.PackageTypeID = pt.PackageTypeID + ON ol.PackageTypeID = pt.PackageTypeID INNER JOIN Sales.Customers AS c - ON c.CustomerID = o.CustomerID - WHERE CASE WHEN ol.LastEditedWhen > o.LastEditedWhen THEN ol.LastEditedWhen ELSE o.LastEditedWhen END > @LastCutoff + ON c.CustomerID = o.CustomerID + WHERE CASE WHEN ol.LastEditedWhen > o.LastEditedWhen THEN ol.LastEditedWhen ELSE o.LastEditedWhen END > @LastCutoff AND CASE WHEN ol.LastEditedWhen > o.LastEditedWhen THEN ol.LastEditedWhen ELSE o.LastEditedWhen END <= @NewCutoff ORDER BY o.OrderID; @@ -5978,8 +5974,6 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - DECLARE @InitialLoadDate date = '20130101'; SELECT CAST(po.OrderDate AS date) AS [Date Key], po.PurchaseOrderID AS [WWI Purchase Order ID], @@ -5995,10 +5989,10 @@ BEGIN INNER JOIN Purchasing.PurchaseOrderLines AS pol ON po.PurchaseOrderID = pol.PurchaseOrderID INNER JOIN Warehouse.StockItems AS si - ON pol.StockItemID = si.StockItemID + ON pol.StockItemID = si.StockItemID INNER JOIN Warehouse.PackageTypes AS pt - ON pol.PackageTypeID = pt.PackageTypeID - WHERE CASE WHEN pol.LastEditedWhen > po.LastEditedWhen THEN pol.LastEditedWhen ELSE po.LastEditedWhen END > @LastCutoff + ON pol.PackageTypeID = pt.PackageTypeID + WHERE CASE WHEN pol.LastEditedWhen > po.LastEditedWhen THEN pol.LastEditedWhen ELSE po.LastEditedWhen END > @LastCutoff AND CASE WHEN pol.LastEditedWhen > po.LastEditedWhen THEN pol.LastEditedWhen ELSE po.LastEditedWhen END <= @NewCutoff ORDER BY po.PurchaseOrderID; @@ -6018,9 +6012,6 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - DECLARE @InitialLoadDate date = '20130101'; - SELECT CAST(i.InvoiceDate AS date) AS [Invoice Date Key], CAST(i.ConfirmedDeliveryTime AS date) AS [Delivery Date Key], i.InvoiceID AS [WWI Invoice ID], @@ -6043,16 +6034,16 @@ BEGIN CASE WHEN il.LastEditedWhen > i.LastEditedWhen THEN il.LastEditedWhen ELSE i.LastEditedWhen END AS [Last Modified When] FROM Sales.Invoices AS i INNER JOIN Sales.InvoiceLines AS il - ON i.InvoiceID = il.InvoiceID + ON i.InvoiceID = il.InvoiceID INNER JOIN Warehouse.StockItems AS si - ON il.StockItemID = si.StockItemID + ON il.StockItemID = si.StockItemID INNER JOIN Warehouse.PackageTypes AS pt - ON il.PackageTypeID = pt.PackageTypeID + ON il.PackageTypeID = pt.PackageTypeID INNER JOIN Sales.Customers AS c - ON i.CustomerID = c.CustomerID + ON i.CustomerID = c.CustomerID INNER JOIN Sales.Customers AS bt - ON i.BillToCustomerID = bt.CustomerID - WHERE CASE WHEN il.LastEditedWhen > i.LastEditedWhen THEN il.LastEditedWhen ELSE i.LastEditedWhen END > @LastCutoff + ON i.BillToCustomerID = bt.CustomerID + WHERE CASE WHEN il.LastEditedWhen > i.LastEditedWhen THEN il.LastEditedWhen ELSE i.LastEditedWhen END > @LastCutoff AND CASE WHEN il.LastEditedWhen > i.LastEditedWhen THEN il.LastEditedWhen ELSE i.LastEditedWhen END <= @NewCutoff ORDER BY i.InvoiceID, il.InvoiceLineID; @@ -6096,9 +6087,6 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - DECLARE @InitialLoadDate date = '20130101'; - SELECT CAST(ct.TransactionDate AS date) AS [Date Key], ct.CustomerTransactionID AS [WWI Customer Transaction ID], CAST(NULL AS int) AS [WWI Supplier Transaction ID], @@ -6118,9 +6106,9 @@ BEGIN ct.LastEditedWhen AS [Last Modified When] FROM Sales.CustomerTransactions AS ct LEFT OUTER JOIN Sales.Invoices AS i - ON ct.InvoiceID = i.InvoiceID - WHERE ct.LastEditedWhen > @LastCutoff - AND ct.LastEditedWhen <= @NewCutoff + ON ct.InvoiceID = i.InvoiceID + WHERE ct.LastEditedWhen > @LastCutoff + AND ct.LastEditedWhen <= @NewCutoff UNION ALL @@ -6142,8 +6130,8 @@ BEGIN st.PaymentMethodID AS [WWI Payment Method ID], st.LastEditedWhen AS [Last Modified When] FROM Purchasing.SupplierTransactions AS st - WHERE st.LastEditedWhen > @LastCutoff - AND st.LastEditedWhen <= @NewCutoff; + WHERE st.LastEditedWhen > @LastCutoff + AND st.LastEditedWhen <= @NewCutoff; RETURN 0; END; @@ -6157,7 +6145,7 @@ GO -- initial data population to ship date EXEC WideWorldImporters.DataLoadSimulation.Configuration_ApplyDataLoadSimulationProcedures; -EXEC WideWorldImporters.DataLoadSimulation.DailyProcessToCreateHistory +EXEC WideWorldImporters.DataLoadSimulation.DailyProcessToCreateHistory @StartDate = '20130101', @EndDate = '20160331', @AverageNumberOfCustomerOrdersPerDay = 60, @@ -6170,7 +6158,7 @@ EXEC WideWorldImporters.DataLoadSimulation.Configuration_RemoveDataLoadSimulatio -- roll data up to current date -EXEC WideWorldImporters.DataLoadSimulation.PopulateDataToCurrentDate +EXEC WideWorldImporters.DataLoadSimulation.PopulateDataToCurrentDate @AverageNumberOfCustomerOrdersPerDay = 60, @SaturdayPercentageOfNormalWorkDay = 50, @SundayPercentageOfNormalWorkDay = 0, diff --git a/samples/databases/wide-world-importers/wwi-dw-database-scripts/2-wwi-dw-construct-database-from-metadata-tables.sql b/samples/databases/wide-world-importers/wwi-dw-database-scripts/2-wwi-dw-construct-database-from-metadata-tables.sql index 079e7ddd..7655a32f 100644 --- a/samples/databases/wide-world-importers/wwi-dw-database-scripts/2-wwi-dw-construct-database-from-metadata-tables.sql +++ b/samples/databases/wide-world-importers/wwi-dw-database-scripts/2-wwi-dw-construct-database-from-metadata-tables.sql @@ -72,50 +72,59 @@ DECLARE @PrimaryKeyColumn nvarchar(max) = N''; SET @SQL = N''; -SET @SQL += N'USE master;' + @CrLf + @CrLf +SET @SQL += N'USE master;' + @CrLf + @CrLf + N'IF EXISTS(SELECT 1 FROM sys.databases WHERE name = N''WideWorldImportersDW'')' + @CrLf - + N'BEGIN' + @CrLf - + N' ALTER DATABASE WideWorldImportersDW SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' + @CrLf + + N'BEGIN' + @CrLf + + N' ALTER DATABASE WideWorldImportersDW SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' + @CrLf + N' DROP DATABASE WideWorldImportersDW;' + @CrLf + N'END;' + @CrLf + @GO - + N'CREATE DATABASE WideWorldImportersDW' + @CrLf - + N'ON' + @CrLf + + N'CREATE DATABASE WideWorldImportersDW' + @CrLf + + N'ON PRIMARY' + @CrLf + N'( ' + @CrLf - + N' NAME = WWI_Data,' + @CrLf + + N' NAME = WWI_Primary,' + @CrLf + N' FILENAME = ''' + @SQLDataFolder + N'WideWorldImportersDW.mdf'',' + @CrLf + N' SIZE = 2GB,' + @CrLf + N' MAXSIZE = UNLIMITED,' + @CrLf - + N' FILEGROWTH = 64MB' + @CrLf - + N')' + @CrLf - + N'LOG ON' + @CrLf - + N'(' + @CrLf - + N' NAME = WWI_Log,' + @CrLf - + N' FILENAME = ''' + @SQLLogFolder + N'WideWorldImportersDW.ldf'',' + @CrLf - + N' SIZE = 100MB,' + @CrLf - + N' MAXSIZE = UNLIMITED,' + @CrLf + N' FILEGROWTH = 64MB' + @CrLf - + N')' + @CrLf + + N'),' + @CrLf + + N'FILEGROUP USERDATA DEFAULT' + @CrLf + + N'( ' + @CrLf + + N' NAME = WWI_UserData,' + @CrLf + + N' FILENAME = ''' + @SQLDataFolder + N'WideWorldImportersDW_UserData.ndf'',' + @CrLf + + N' SIZE = 2GB,' + @CrLf + + N' MAXSIZE = UNLIMITED,' + @CrLf + + N' FILEGROWTH = 64MB' + @CrLf + + N')' + @CrLf + + N'LOG ON' + @CrLf + + N'(' + @CrLf + + N' NAME = WWI_Log,' + @CrLf + + N' FILENAME = ''' + @SQLLogFolder + N'WideWorldImportersDW.ldf'',' + @CrLf + + N' SIZE = 100MB,' + @CrLf + + N' MAXSIZE = UNLIMITED,' + @CrLf + + N' FILEGROWTH = 64MB' + @CrLf + + N')' + @CrLf + N'COLLATE Latin1_General_100_CI_AS;' + @CrLf + @GO + N'ALTER DATABASE WideWorldImportersDW SET RECOVERY SIMPLE;' + @CrLf + @GO + + N'ALTER DATABASE WideWorldImporters SET AUTO_UPDATE_STATISTICS_ASYNC ON;' + @CrLf + @GO + N'ALTER AUTHORIZATION ON DATABASE::WideWorldImportersDW to sa;' + @CrLf + @GO + N'ALTER DATABASE WideWorldImportersDW' + @CrLf + N'SET QUERY_STORE' + @CrLf - + N'(' + @CrLf - + @Indent + N'OPERATION_MODE = READ_WRITE,' + @CrLf + + N'(' + @CrLf + + @Indent + N'OPERATION_MODE = READ_WRITE,' + @CrLf + @Indent + N'CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),' + @CrLf - + @Indent + N'DATA_FLUSH_INTERVAL_SECONDS = 3000,' + @CrLf - + @Indent + N'MAX_STORAGE_SIZE_MB = 500,' + @CrLf - + @Indent + N'INTERVAL_LENGTH_MINUTES = 15,' + @CrLf - + @Indent + N'SIZE_BASED_CLEANUP_MODE = AUTO,' + @CrLf - + @Indent + N'QUERY_CAPTURE_MODE = AUTO,' + @CrLf - + @Indent + N'MAX_PLANS_PER_QUERY = 1000' + @CrLf + + @Indent + N'DATA_FLUSH_INTERVAL_SECONDS = 3000,' + @CrLf + + @Indent + N'MAX_STORAGE_SIZE_MB = 500,' + @CrLf + + @Indent + N'INTERVAL_LENGTH_MINUTES = 15,' + @CrLf + + @Indent + N'SIZE_BASED_CLEANUP_MODE = AUTO,' + @CrLf + + @Indent + N'QUERY_CAPTURE_MODE = AUTO,' + @CrLf + + @Indent + N'MAX_PLANS_PER_QUERY = 1000' + @CrLf + N');' + @CrLf + @GO + N'USE WideWorldImportersDW;' + @CrLf + @GO; DECLARE SchemaList CURSOR FAST_FORWARD READ_ONLY FOR SELECT SchemaName, SchemaDescription -FROM Metadata.[Schemas] +FROM Metadata.[Schemas] ORDER BY SchemaID; OPEN SchemaList; @@ -138,8 +147,8 @@ SET @SQL += @CrLf; DECLARE SequenceList CURSOR FAST_FORWARD READ_ONLY FOR -SELECT DISTINCT DefaultSequenceName, DataType -FROM Metadata.[Columns] +SELECT DISTINCT DefaultSequenceName, DataType +FROM Metadata.[Columns] WHERE DefaultSequenceName IS NOT NULL ORDER BY DefaultSequenceName; @@ -147,7 +156,7 @@ OPEN SequenceList; FETCH NEXT FROM SequenceList INTO @DefaultSequenceName, @DataType; WHILE @@FETCH_STATUS = 0 BEGIN - SET @SQL += N'CREATE SEQUENCE ' + QUOTENAME(N'Sequences') + N'.' + QUOTENAME(@DefaultSequenceName) + N' AS ' + LOWER(@DataType) + SET @SQL += N'CREATE SEQUENCE ' + QUOTENAME(N'Sequences') + N'.' + QUOTENAME(@DefaultSequenceName) + N' AS ' + LOWER(@DataType) + N' START WITH 1;' + @CrLf; SET @AnySequencesCreated = 1; FETCH NEXT FROM SequenceList INTO @DefaultSequenceName, @DataType; @@ -162,17 +171,17 @@ END; DECLARE TableList CURSOR FAST_FORWARD READ_ONLY FOR -SELECT SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription -FROM Metadata.[Tables] +SELECT SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription +FROM Metadata.[Tables] ORDER BY TableCreationOrder; OPEN TableList; -FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeTemporalColumns, +FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeTemporalColumns, @IncludeModificationTrackingColumns, @TableDescription; WHILE @@FETCH_STATUS = 0 BEGIN - + -- Start creating the next table SET @SQL += N'CREATE TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + @CrLf + N'(' + @CrLf; @@ -181,34 +190,34 @@ BEGIN SET @ExtendedPropertySQL = N'EXEC sys.sp_addextendedproperty @name = N''Description'', @value = N''' + REPLACE(@TableDescription, N'''', N'''''') + N''', ' + N'@level0type = N''SCHEMA'', @level0name = ''' + @SchemaName + N''', ' + N'@level1type = N''TABLE'', @level1name = ''' + @TableName + N''';' + @CrLf + @CrLf; - + DECLARE ColumnList CURSOR FAST_FORWARD READ_ONLY FOR SELECT ColumnName, IsPrimaryKeyColumn, DataType, IsNullable, MaximumLength, DecimalPrecision, DecimalScale, HasDefaultValue, UsesSequenceDefault, DefaultSequenceName, - DefaultValue, IsUnique, HasForeignKeyReference, + DefaultValue, IsUnique, HasForeignKeyReference, (SELECT SchemaName FROM Metadata.Tables AS t WHERE t.TableName = ForeignKeyTable) AS ForeignKeySchema, ForeignKeyTable, ForeignKeyColumn, AutomaticallyIndexForeignKey, ColumnDescription FROM Metadata.[Columns] - WHERE TableName = @TableName + WHERE TableName = @TableName ORDER BY ColumnID; - + OPEN ColumnList; - FETCH NEXT FROM ColumnList + FETCH NEXT FROM ColumnList INTO @ColumnName, @IsPrimaryKeyColumn, @DataType, @IsNullable, @MaximumLength, @DecimalPrecision, @DecimalScale, @HasDefaultValue, @UsesSequenceDefault, @DefaultSequenceName, @DefaultValue, @IsUnique, @HasForeignKeyReference, @ForeignKeySchema, @ForeignKeyTable, @ForeignKeyColumn, @AutomaticallyIndexForeignKey, @ColumnDescription; - + WHILE @@FETCH_STATUS = 0 BEGIN - + IF @FirstColumnOfTable = 0 BEGIN SET @SQL += N',' + @CrLf; END; SET @FirstColumnOfTable = 0; - + IF UPPER(LEFT(@DataType, 2)) = N'AS' BEGIN SET @SQL += @Indent + QUOTENAME(@ColumnName) + N' ' + @DataType; @@ -222,7 +231,7 @@ BEGIN THEN N'(' + CAST(@DecimalScale AS nvarchar(10)) + N')' ELSE N'' END; - + SET @SQL += CASE WHEN @IsNullable = 0 THEN N' NOT' ELSE N'' END + N' NULL'; @@ -230,44 +239,44 @@ BEGIN BEGIN SET @SQL += N' IDENTITY(1,1)'; END; - END; -- of if not a calculated column - + END; -- of if not a calculated column + IF @IsPrimaryKeyColumn <> 0 BEGIN - SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + QUOTENAME(N'PK_' + REPLACE(@SchemaName, N' ', N'_') + N'_' + REPLACE(@TableName, N' ', N'_')) + N' PRIMARY KEY'; END; - + IF @IsPrimaryKeyColumn = 0 AND @IsUnique <> 0 BEGIN - SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + QUOTENAME(N'UQ_' + REPLACE(@SchemaName, N' ', N'_') + N'_' + REPLACE(@TableName, N' ', N'_') + N'_' + REPLACE(@ColumnName, N' ', N'_')) + N' UNIQUE'; END; - + IF @HasDefaultValue <> 0 AND @DefaultSequenceName IS NOT NULL BEGIN - SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + QUOTENAME(N'DF_' + REPLACE(@SchemaName, N' ', N'_') + N'_' + REPLACE(@TableName, N' ', N'_') + N'_' + REPLACE(@ColumnName, N' ', N'_')) + @CrLf + @Indent + @Indent + @Indent + N'DEFAULT(' - + CASE WHEN @UsesSequenceDefault <> 0 + + CASE WHEN @UsesSequenceDefault <> 0 THEN N'NEXT VALUE FOR ' + QUOTENAME(N'Sequences') + N'.' + QUOTENAME(@DefaultSequenceName) - ELSE @DefaultValue + ELSE @DefaultValue END + N')'; END; - - IF @HasForeignKeyReference <> 0 + + IF @HasForeignKeyReference <> 0 BEGIN - SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' - + QUOTENAME(CASE WHEN @IsPrimaryKeyColumn <> 0 THEN N'PK' ELSE N'' END - + N'FK_' + REPLACE(@SchemaName, N' ', N'_') + N'_' + REPLACE(@TableName, N' ', N'_') + N'_' + REPLACE(@ColumnName, N' ', N'_') - + N'_' + @ForeignKeySchema + N'_' + @ForeignKeyTable) - + @CrLf + @Indent + @Indent + @Indent + SET @SQL += @CrLf + @Indent + @Indent + N'CONSTRAINT ' + + QUOTENAME(CASE WHEN @IsPrimaryKeyColumn <> 0 THEN N'PK' ELSE N'' END + + N'FK_' + REPLACE(@SchemaName, N' ', N'_') + N'_' + REPLACE(@TableName, N' ', N'_') + N'_' + REPLACE(@ColumnName, N' ', N'_') + + N'_' + @ForeignKeySchema + N'_' + @ForeignKeyTable) + + @CrLf + @Indent + @Indent + @Indent + N'FOREIGN KEY REFERENCES ' + QUOTENAME(@ForeignKeySchema) + N'.' + QUOTENAME(@ForeignKeyTable) + N' (' + QUOTENAME(@ForeignKeyColumn) + N')'; IF @IncludeForeignKeyIndexes <> 0 AND @IsPrimaryKeyColumn = 0 AND @AutomaticallyIndexForeignKey <> 0 BEGIN - SET @ForeignKeyIndexSQL += N'CREATE INDEX ' + SET @ForeignKeyIndexSQL += N'CREATE INDEX ' + QUOTENAME(N'FK_' + REPLACE(@SchemaName, N' ', N'_') + N'_' + REPLACE(@TableName, N' ', N'_') + N'_' + REPLACE(@ColumnName, N' ', N'_')) + @CrLf + N'ON ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + N' (' + QUOTENAME(@ColumnName) + N');' + @CrLf; @@ -278,13 +287,13 @@ BEGIN END; END; - + SET @ExtendedPropertySQL += N'EXEC sys.sp_addextendedproperty @name = N''Description'', @value = ''' + REPLACE(@ColumnDescription, N'''', N'''''') + N''', @level0type = N''SCHEMA'', @level0name = ''' + @SchemaName + N''', ' + N'@level1type = N''TABLE'', @level1name = ''' + @TableName + N''', ' + N'@level2type = N''COLUMN'', @level2name = ''' + @ColumnName + N''';' + @CrLf; - FETCH NEXT FROM ColumnList + FETCH NEXT FROM ColumnList INTO @ColumnName, @IsPrimaryKeyColumn, @DataType, @IsNullable, @MaximumLength, @DecimalPrecision, @DecimalScale, @HasDefaultValue, @UsesSequenceDefault, @DefaultSequenceName, @DefaultValue, @IsUnique, @HasForeignKeyReference, @ForeignKeySchema, @ForeignKeyTable, @ForeignKeyColumn, @AutomaticallyIndexForeignKey, @@ -301,17 +310,17 @@ BEGIN SET @SQL += N',' + @CrLf; END; SET @FirstColumnOfTable = 0; - - SET @SQL += @Indent + QUOTENAME(@LastEditedByColumnName) + N' int NOT NULL' + @CrLf - + @Indent + @Indent + N'CONSTRAINT ' - + QUOTENAME(N'FK_' + REPLACE(@SchemaName, N' ', N'_') + N'_' + REPLACE(@TableName, N' ', N'_') + + SET @SQL += @Indent + QUOTENAME(@LastEditedByColumnName) + N' int NOT NULL' + @CrLf + + @Indent + @Indent + N'CONSTRAINT ' + + QUOTENAME(N'FK_' + REPLACE(@SchemaName, N' ', N'_') + N'_' + REPLACE(@TableName, N' ', N'_') + N'_' + @LastEditedByFKSchemaName + N'_' + @LastEditedByFKTableName) + @CrLf - + @Indent + @Indent + @Indent + + @Indent + @Indent + @Indent + N'FOREIGN KEY REFERENCES ' + QUOTENAME(@LastEditedByFKSchemaName) + N'.' + QUOTENAME(@LastEditedByFKTableName) - + N' (' + QUOTENAME(@LastEditedByFKColumnName) + N')' + + N' (' + QUOTENAME(@LastEditedByFKColumnName) + N')' + CASE WHEN @IncludeTemporalColumns <> 0 THEN N'' ELSE N',' + @CrLf + @Indent + QUOTENAME(@LastEditedWhenColumnName) + N' datetime NOT NULL' + @CrLf - + @Indent + @Indent + N'CONSTRAINT ' + + @Indent + @Indent + N'CONSTRAINT ' + QUOTENAME(N'DF_' + REPLACE(@SchemaName, N' ', N'_') + N'_' + REPLACE(@TableName, N' ', N'_') + N'_' + @LastEditedWhenColumnName) + @CrLf + @Indent + @Indent + @Indent + N'DEFAULT(SYSDATETIME())' END; @@ -324,21 +333,21 @@ BEGIN SET @SQL += N',' + @CrLf; END; SET @FirstColumnOfTable = 0; - + SET @SQL += @Indent + QUOTENAME(@TemporalFromColumnName) + N' datetime2(7) GENERATED ALWAYS AS ROW START,' + @CrLf + @Indent + QUOTENAME(@TemporalToColumnName) + N' datetime2(7) GENERATED ALWAYS AS ROW END,' + @CrLf - + @Indent + N'PERIOD FOR SYSTEM_TIME (' + QUOTENAME(@TemporalFromColumnName) + + @Indent + N'PERIOD FOR SYSTEM_TIME (' + QUOTENAME(@TemporalFromColumnName) + N',' + QUOTENAME(@TemporalToColumnName) + N')'; END; -- of if temporal included -- Finish creating the table SET @SQL += @CrLf + N')'; - + IF @IncludeTemporalColumns <> 0 BEGIN SET @SQL += @CrLf + N'WITH ' + @CrLf + N'(' + @CrLf - + @Indent + N'SYSTEM_VERSIONING = ON (HISTORY_TABLE = ' + + @Indent + N'SYSTEM_VERSIONING = ON (HISTORY_TABLE = ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName + N'_' + @TemporalTableSuffix) + N')' + @CrLf + N')'; END; @@ -352,14 +361,14 @@ BEGIN SET @SQL += @ForeignKeyIndexSQL + @GO; END; END; - + DECLARE ConstraintList CURSOR FAST_FORWARD READ_ONLY FOR - SELECT ConstraintName, ConstraintDefinition, ConstraintDescription + SELECT ConstraintName, ConstraintDefinition, ConstraintDescription FROM Metadata.[Constraints] - WHERE TableName = @TableName + WHERE TableName = @TableName ORDER BY [ConstraintID]; - + OPEN ConstraintList; FETCH NEXT FROM ConstraintList INTO @ConstraintName, @ConstraintDefinition, @ConstraintDescription; WHILE @@FETCH_STATUS = 0 @@ -383,9 +392,9 @@ BEGIN FOR SELECT IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription FROM Metadata.[Indexes] - WHERE TableName = @TableName + WHERE TableName = @TableName ORDER BY [IndexID]; - + OPEN IndexList; FETCH NEXT FROM IndexList INTO @IndexName, @IndexColumns, @IncludedColumns, @IsUnique, @FilterClause, @IndexDescription; WHILE @@FETCH_STATUS = 0 @@ -415,21 +424,21 @@ BEGIN DECLARE MaskedColumnList CURSOR FAST_FORWARD READ_ONLY FOR - SELECT ColumnName, ColumnMaskFunction + SELECT ColumnName, ColumnMaskFunction FROM Metadata.[Columns] - WHERE TableName = @TableName + WHERE TableName = @TableName AND ColumnMaskFunction IS NOT NULL ORDER BY ColumnID; - + OPEN MaskedColumnList; - FETCH NEXT FROM MaskedColumnList + FETCH NEXT FROM MaskedColumnList INTO @ColumnName, @ColumnMaskFunction; - + WHILE @@FETCH_STATUS = 0 BEGIN - SET @SQL += N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + @CrLf + SET @SQL += N'ALTER TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + @CrLf + @Indent + N'ALTER COLUMN ' + QUOTENAME(@ColumnName) + N' ADD MASKED WITH (FUNCTION = ''' + @ColumnMaskFunction + N''');' + @CrLf + @GO; - FETCH NEXT FROM MaskedColumnList + FETCH NEXT FROM MaskedColumnList INTO @ColumnName, @ColumnMaskFunction; END; @@ -441,7 +450,7 @@ BEGIN SET @SQL += @ExtendedPropertySQL + @GO; END; - FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeTemporalColumns, + FETCH NEXT FROM TableList INTO @SchemaName, @TableName, @IncludeTemporalColumns, @IncludeModificationTrackingColumns, @TableDescription; END; -- of for each table @@ -451,41 +460,41 @@ DEALLOCATE TableList; IF @AnySequencesCreated <> 0 BEGIN SET @SQL += N'CREATE PROCEDURE Sequences.ReseedSequenceBeyondTableValues' + @CrLf - + N'@SequenceName sysname, ' + @CrLf - + N'@SchemaName sysname, ' + @CrLf - + N'@TableName sysname, ' + @CrLf - + N'@ColumnName sysname ' + @CrLf + + N'@SequenceName sysname, ' + @CrLf + + N'@SchemaName sysname, ' + @CrLf + + N'@TableName sysname, ' + @CrLf + + N'@ColumnName sysname ' + @CrLf + N'AS BEGIN' + @CrLf - + @Indent + N'-- Ensures that the next sequence value is above the maximum value of the supplied table column' + @CrLf - + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf - + @Indent + N'DECLARE @SQL nvarchar(max);' + @CrLf - + @Indent + N'DECLARE @CurrentTableMaximumValue bigint;' + @CrLf - + @Indent + N'DECLARE @NewSequenceValue bigint;' + @CrLf + + @Indent + N'-- Ensures that the next sequence value is above the maximum value of the supplied table column' + @CrLf + + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf + + @Indent + N'DECLARE @SQL nvarchar(max);' + @CrLf + + @Indent + N'DECLARE @CurrentTableMaximumValue bigint;' + @CrLf + + @Indent + N'DECLARE @NewSequenceValue bigint;' + @CrLf + @Indent + N'DECLARE @CurrentSequenceMaximumValue bigint' + @CrLf + @Indent + @Indent + N'= (SELECT CAST(current_value AS bigint) FROM sys.sequences' + @CrLf + @Indent + @Indent + N' WHERE name = @SequenceName' + @CrLf - + @Indent + @Indent + N' AND SCHEMA_NAME(schema_id) = N''Sequences'');' + @CrLf + + @Indent + @Indent + N' AND SCHEMA_NAME(schema_id) = N''Sequences'');' + @CrLf + @Indent + N'CREATE TABLE #CurrentValue' + @CrLf - + @Indent + N'(' + @CrLf + + @Indent + N'(' + @CrLf + @Indent + @Indent + N'CurrentValue bigint' + @CrLf - + @Indent + N')' + @CrLf + @CrLf + + @Indent + N')' + @CrLf + @CrLf + @Indent + N'SET @SQL = N''INSERT #CurrentValue (CurrentValue) ' + N'SELECT COALESCE(MAX('' + QUOTENAME(@ColumnName) + N''), 0) ' + N'FROM '' + QUOTENAME(@SchemaName) + N''.'' + QUOTENAME(@TableName) + N'';'';' + @CrLf - + @Indent + N'EXECUTE (@SQL);' + @CrLf - + @Indent + N'SET @CurrentTableMaximumValue = (SELECT CurrentValue FROM #CurrentValue);' + @CrLf - + @Indent + N'DROP TABLE #CurrentValue;' + @CrLf + @CrLf + + @Indent + N'EXECUTE (@SQL);' + @CrLf + + @Indent + N'SET @CurrentTableMaximumValue = (SELECT CurrentValue FROM #CurrentValue);' + @CrLf + + @Indent + N'DROP TABLE #CurrentValue;' + @CrLf + @CrLf + @Indent + N'IF @CurrentTableMaximumValue >= @CurrentSequenceMaximumValue' + @CrLf - + @Indent + N'BEGIN' + @CrLf - + @Indent + @Indent + N'SET @NewSequenceValue = @CurrentTableMaximumValue + 1;' + @CrLf - + @Indent + @Indent + N'SET @SQL = N''ALTER SEQUENCE Sequences.'' + QUOTENAME(@SequenceName) + N'' RESTART WITH '' + CAST(@NewSequenceValue AS nvarchar(20)) + N'';'';' + @CrLf - + @Indent + @Indent + N'EXECUTE (@SQL);' + @CrLf - + @Indent + N'END;' + @CrLf + + @Indent + N'BEGIN' + @CrLf + + @Indent + @Indent + N'SET @NewSequenceValue = @CurrentTableMaximumValue + 1;' + @CrLf + + @Indent + @Indent + N'SET @SQL = N''ALTER SEQUENCE Sequences.'' + QUOTENAME(@SequenceName) + N'' RESTART WITH '' + CAST(@NewSequenceValue AS nvarchar(20)) + N'';'';' + @CrLf + + @Indent + @Indent + N'EXECUTE (@SQL);' + @CrLf + + @Indent + N'END;' + @CrLf + N'END;' + @CrLf + @GO; DECLARE SequenceList CURSOR FAST_FORWARD READ_ONLY FOR - SELECT t.SchemaName, t.TableName, c.ColumnName, c.DefaultSequenceName + SELECT t.SchemaName, t.TableName, c.ColumnName, c.DefaultSequenceName FROM Metadata.[Columns] AS c INNER JOIN Metadata.[Tables] AS t ON c.TableName = t.TableName @@ -494,8 +503,8 @@ BEGIN SET @SQL += N'CREATE PROCEDURE Sequences.ReseedAllSequences' + @CrLf + N'AS BEGIN' + @CrLf - + @Indent + N'-- Ensures that the next sequence values are above the maximum value of the related table columns' + @CrLf - + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf; + + @Indent + N'-- Ensures that the next sequence values are above the maximum value of the related table columns' + @CrLf + + @Indent + N'SET NOCOUNT ON;' + @CrLf + @CrLf; OPEN SequenceList; FETCH NEXT FROM SequenceList INTO @SchemaName, @TableName, @ColumnName, @DefaultSequenceName; diff --git a/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql index 2a98f567..d117d669 100644 --- a/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql @@ -18,20 +18,20 @@ RETURN SELECT @Date AS [Date], CAST(N'CY' + CAST(YEAR(@Date) AS nvarchar(4)) + N'-' + SUBSTRING(DATENAME(month, @Date), 1, 3) AS nvarchar(10)) AS [Calendar Month Label], YEAR(@Date) AS [Calendar Year], CAST(N'CY' + CAST(YEAR(@Date) AS nvarchar(4)) AS nvarchar(10)) AS [Calendar Year Label], - CASE WHEN MONTH(@Date) IN (11, 12) - THEN MONTH(@Date) - 10 + CASE WHEN MONTH(@Date) IN (11, 12) + THEN MONTH(@Date) - 10 ELSE MONTH(@Date) + 2 END AS [Fiscal Month Number], CAST(N'FY' + CAST(CASE WHEN MONTH(@Date) IN (11, 12) - THEN YEAR(@Date) + 1 + THEN YEAR(@Date) + 1 ELSE YEAR(@Date) END AS nvarchar(4)) + N'-' + SUBSTRING(DATENAME(month, @Date), 1, 3) AS nvarchar(20)) AS [Fiscal Month Label], CASE WHEN MONTH(@Date) IN (11, 12) - THEN YEAR(@Date) + 1 + THEN YEAR(@Date) + 1 ELSE YEAR(@Date) END AS [Fiscal Year], CAST(N'FY' + CAST(CASE WHEN MONTH(@Date) IN (11, 12) - THEN YEAR(@Date) + 1 + THEN YEAR(@Date) + 1 ELSE YEAR(@Date) END AS nvarchar(4)) AS nvarchar(10)) AS [Fiscal Year Label], DATEPART(ISO_WEEK, @Date) AS [ISO Week Number]; @@ -54,19 +54,19 @@ BEGIN BEGIN TRAN; - WHILE YEAR(@DateCounter) = @YearNumber + WHILE YEAR(@DateCounter) = @YearNumber BEGIN IF NOT EXISTS (SELECT 1 FROM Dimension.[Date] WHERE [Date] = @DateCounter) BEGIN - INSERT Dimension.[Date] - ([Date], [Day Number], [Day], [Month], [Short Month], - [Calendar Month Number], [Calendar Month Label], [Calendar Year], [Calendar Year Label], - [Fiscal Month Number], [Fiscal Month Label], [Fiscal Year], [Fiscal Year Label], + INSERT Dimension.[Date] + ([Date], [Day Number], [Day], [Month], [Short Month], + [Calendar Month Number], [Calendar Month Label], [Calendar Year], [Calendar Year Label], + [Fiscal Month Number], [Fiscal Month Label], [Fiscal Year], [Fiscal Year Label], [ISO Week Number]) - SELECT [Date], [Day Number], [Day], [Month], [Short Month], - [Calendar Month Number], [Calendar Month Label], [Calendar Year], [Calendar Year Label], - [Fiscal Month Number], [Fiscal Month Label], [Fiscal Year], [Fiscal Year Label], - [ISO Week Number] + SELECT [Date], [Day Number], [Day], [Month], [Short Month], + [Calendar Month Number], [Calendar Month Label], [Calendar Year], [Calendar Year Label], + [Fiscal Month Number], [Fiscal Month Label], [Fiscal Year], [Fiscal Year Label], + [ISO Week Number] FROM Integration.GenerateDateDimensionColumns(@DateCounter); END; SET @DateCounter = DATEADD(day, 1, @DateCounter); @@ -125,16 +125,16 @@ BEGIN DECLARE @DataLoadStartedWhen datetime2(7) = SYSDATETIME(); - INSERT Integration.Lineage - ([Data Load Started], [Table Name], [Data Load Completed], + INSERT Integration.Lineage + ([Data Load Started], [Table Name], [Data Load Completed], [Was Successful], [Source System Cutoff Time]) - VALUES + VALUES (@DataLoadStartedWhen, @TableName, NULL, 0, @NewCutoffTime); - SELECT TOP(1) [Lineage Key] AS LineageKey - FROM Integration.Lineage - WHERE [Table Name] = @TableName + SELECT TOP(1) [Lineage Key] AS LineageKey + FROM Integration.Lineage + WHERE [Table Name] = @TableName AND [Data Load Started] = @DataLoadStartedWhen ORDER BY LineageKey DESC; @@ -157,9 +157,9 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'City' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'City' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); WITH RowsToCloseOff @@ -169,32 +169,32 @@ BEGIN FROM Integration.City_Staging AS c GROUP BY c.[WWI City ID] ) - UPDATE c + UPDATE c SET c.[Valid To] = rtco.[Valid From] FROM Dimension.City AS c INNER JOIN RowsToCloseOff AS rtco ON c.[WWI City ID] = rtco.[WWI City ID] WHERE c.[Valid To] = @EndOfTime; - INSERT Dimension.City - ([WWI City ID], City, [State Province], Country, Continent, - [Sales Territory], Region, Subregion, [Location], - [Latest Recorded Population], [Valid From], [Valid To], + INSERT Dimension.City + ([WWI City ID], City, [State Province], Country, Continent, + [Sales Territory], Region, Subregion, [Location], + [Latest Recorded Population], [Valid From], [Valid To], [Lineage Key]) - SELECT [WWI City ID], City, [State Province], Country, Continent, - [Sales Territory], Region, Subregion, [Location], - [Latest Recorded Population], [Valid From], [Valid To], + SELECT [WWI City ID], City, [State Province], Country, Continent, + [Sales Territory], Region, Subregion, [Location], + [Latest Recorded Population], [Valid From], [Valid To], @LineageKey FROM Integration.City_Staging; - UPDATE Integration.Lineage + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'City'; @@ -220,9 +220,9 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Customer' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Customer' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); WITH RowsToCloseOff @@ -232,7 +232,7 @@ BEGIN FROM Integration.Customer_Staging AS c GROUP BY c.[WWI Customer ID] ) - UPDATE c + UPDATE c SET c.[Valid To] = rtco.[Valid From] FROM Dimension.Customer AS c INNER JOIN RowsToCloseOff AS rtco @@ -240,22 +240,22 @@ BEGIN WHERE c.[Valid To] = @EndOfTime; INSERT Dimension.Customer - ([WWI Customer ID], Customer, [Bill To Customer], Category, - [Buying Group], [Primary Contact], [Postal Code], [Valid From], [Valid To], + ([WWI Customer ID], Customer, [Bill To Customer], Category, + [Buying Group], [Primary Contact], [Postal Code], [Valid From], [Valid To], [Lineage Key]) - SELECT [WWI Customer ID], Customer, [Bill To Customer], Category, - [Buying Group], [Primary Contact], [Postal Code], [Valid From], [Valid To], + SELECT [WWI Customer ID], Customer, [Bill To Customer], Category, + [Buying Group], [Primary Contact], [Postal Code], [Valid From], [Valid To], @LineageKey FROM Integration.Customer_Staging; - UPDATE Integration.Lineage + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Customer'; @@ -281,9 +281,9 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Employee' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Employee' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); WITH RowsToCloseOff @@ -293,7 +293,7 @@ BEGIN FROM Integration.Employee_Staging AS e GROUP BY e.[WWI Employee ID] ) - UPDATE e + UPDATE e SET e.[Valid To] = rtco.[Valid From] FROM Dimension.Employee AS e INNER JOIN RowsToCloseOff AS rtco @@ -302,18 +302,18 @@ BEGIN INSERT Dimension.Employee ([WWI Employee ID], Employee, [Preferred Name], [Is Salesperson], Photo, [Valid From], [Valid To], [Lineage Key]) - SELECT [WWI Employee ID], Employee, [Preferred Name], [Is Salesperson], Photo, [Valid From], [Valid To], + SELECT [WWI Employee ID], Employee, [Preferred Name], [Is Salesperson], Photo, [Valid From], [Valid To], @LineageKey FROM Integration.Employee_Staging; - UPDATE Integration.Lineage + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Employee'; @@ -339,9 +339,9 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Payment Method' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Payment Method' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); WITH RowsToCloseOff @@ -351,7 +351,7 @@ BEGIN FROM Integration.PaymentMethod_Staging AS pm GROUP BY pm.[WWI Payment Method ID] ) - UPDATE pm + UPDATE pm SET pm.[Valid To] = rtco.[Valid From] FROM Dimension.[Payment Method] AS pm INNER JOIN RowsToCloseOff AS rtco @@ -364,14 +364,14 @@ BEGIN @LineageKey FROM Integration.PaymentMethod_Staging; - UPDATE Integration.Lineage + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Payment Method'; @@ -397,9 +397,9 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Stock Item' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Stock Item' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); WITH RowsToCloseOff @@ -409,7 +409,7 @@ BEGIN FROM Integration.StockItem_Staging AS s GROUP BY s.[WWI Stock Item ID] ) - UPDATE s + UPDATE s SET s.[Valid To] = rtco.[Valid From] FROM Dimension.[Stock Item] AS s INNER JOIN RowsToCloseOff AS rtco @@ -417,25 +417,25 @@ BEGIN WHERE s.[Valid To] = @EndOfTime; INSERT Dimension.[Stock Item] - ([WWI Stock Item ID], [Stock Item], Color, [Selling Package], [Buying Package], - Brand, Size, [Lead Time Days], [Quantity Per Outer], [Is Chiller Stock], - Barcode, [Tax Rate], [Unit Price], [Recommended Retail Price], [Typical Weight Per Unit], + ([WWI Stock Item ID], [Stock Item], Color, [Selling Package], [Buying Package], + Brand, Size, [Lead Time Days], [Quantity Per Outer], [Is Chiller Stock], + Barcode, [Tax Rate], [Unit Price], [Recommended Retail Price], [Typical Weight Per Unit], Photo, [Valid From], [Valid To], [Lineage Key]) - SELECT [WWI Stock Item ID], [Stock Item], Color, [Selling Package], [Buying Package], - Brand, Size, [Lead Time Days], [Quantity Per Outer], [Is Chiller Stock], - Barcode, [Tax Rate], [Unit Price], [Recommended Retail Price], [Typical Weight Per Unit], + SELECT [WWI Stock Item ID], [Stock Item], Color, [Selling Package], [Buying Package], + Brand, Size, [Lead Time Days], [Quantity Per Outer], [Is Chiller Stock], + Barcode, [Tax Rate], [Unit Price], [Recommended Retail Price], [Typical Weight Per Unit], Photo, [Valid From], [Valid To], @LineageKey FROM Integration.StockItem_Staging; - UPDATE Integration.Lineage + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Stock Item'; @@ -461,9 +461,9 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Supplier' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Supplier' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); WITH RowsToCloseOff @@ -473,7 +473,7 @@ BEGIN FROM Integration.Supplier_Staging AS s GROUP BY s.[WWI Supplier ID] ) - UPDATE s + UPDATE s SET s.[Valid To] = rtco.[Valid From] FROM Dimension.[Supplier] AS s INNER JOIN RowsToCloseOff AS rtco @@ -481,21 +481,21 @@ BEGIN WHERE s.[Valid To] = @EndOfTime; INSERT Dimension.[Supplier] - ([WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference], + ([WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference], [Payment Days], [Postal Code], [Valid From], [Valid To], [Lineage Key]) - SELECT [WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference], + SELECT [WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference], [Payment Days], [Postal Code], [Valid From], [Valid To], @LineageKey FROM Integration.Supplier_Staging; - UPDATE Integration.Lineage + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Supplier'; @@ -521,9 +521,9 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Transaction Type' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Transaction Type' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); WITH RowsToCloseOff @@ -533,7 +533,7 @@ BEGIN FROM Integration.TransactionType_Staging AS pm GROUP BY pm.[WWI Transaction Type ID] ) - UPDATE pm + UPDATE pm SET pm.[Valid To] = rtco.[Valid From] FROM Dimension.[Transaction Type] AS pm INNER JOIN RowsToCloseOff AS rtco @@ -546,14 +546,14 @@ BEGIN @LineageKey FROM Integration.TransactionType_Staging; - UPDATE Integration.Lineage + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Transaction Type'; @@ -579,9 +579,9 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Movement' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Movement' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); -- Find the dimension keys required @@ -608,9 +608,9 @@ BEGIN AND m.[Last Modifed When] > tt.[Valid From] AND m.[Last Modifed When] <= tt.[Valid To]), 0) FROM Integration.Movement_Staging AS m; - + -- Merge the data into the fact table - + MERGE Fact.Movement AS m USING Integration.Movement_Staging AS ms ON m.[WWI Stock Item Transaction ID] = ms.[WWI Stock Item Transaction ID] @@ -625,19 +625,19 @@ BEGIN m.Quantity = ms.Quantity, m.[Lineage Key] = @LineageKey WHEN NOT MATCHED THEN - INSERT ([Date Key], [Stock Item Key], [Customer Key], [Supplier Key], [Transaction Type Key], + INSERT ([Date Key], [Stock Item Key], [Customer Key], [Supplier Key], [Transaction Type Key], [WWI Stock Item Transaction ID], [WWI Invoice ID], [WWI Purchase Order ID], Quantity, [Lineage Key]) VALUES (ms.[Date Key], ms.[Stock Item Key], ms.[Customer Key], ms.[Supplier Key], ms.[Transaction Type Key], ms.[WWI Stock Item Transaction ID], ms.[WWI Invoice ID], ms.[WWI Purchase Order ID], ms.Quantity, @LineageKey); - UPDATE Integration.Lineage + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Movement'; @@ -663,18 +663,18 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Order' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Order' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); -- Find the dimension keys required UPDATE o - SET o.[City Key] = COALESCE((SELECT TOP(1) c.[City Key] + SET o.[City Key] = COALESCE((SELECT TOP(1) c.[City Key] FROM Dimension.City AS c - WHERE c.[WWI City ID] = o.[WWI City ID] - AND o.[Last Modified When] > c.[Valid From] + WHERE c.[WWI City ID] = o.[WWI City ID] + AND o.[Last Modified When] > c.[Valid From] AND o.[Last Modified When] <= c.[Valid To]), 0), o.[Customer Key] = COALESCE((SELECT TOP(1) c.[Customer Key] FROM Dimension.Customer AS c @@ -697,7 +697,7 @@ BEGIN AND o.[Last Modified When] > e.[Valid From] AND o.[Last Modified When] <= e.[Valid To]), 0) FROM Integration.Order_Staging AS o; - + -- Remove any existing entries for any of these orders DELETE o @@ -706,25 +706,25 @@ BEGIN -- Insert all current details for these orders - INSERT Fact.[Order] - ([City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], - [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], [Description], - Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], + INSERT Fact.[Order] + ([City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], + [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], [Description], + Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key]) - SELECT [City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], - [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], [Description], - Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], + SELECT [City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], + [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], [Description], + Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], @LineageKey FROM Integration.Order_Staging; - - UPDATE Integration.Lineage + + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Order'; @@ -750,18 +750,18 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Purchase' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Purchase' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); -- Find the dimension keys required UPDATE p - SET p.[Supplier Key] = COALESCE((SELECT TOP(1) s.[Supplier Key] + SET p.[Supplier Key] = COALESCE((SELECT TOP(1) s.[Supplier Key] FROM Dimension.Supplier AS s - WHERE s.[WWI Supplier ID] = p.[WWI Supplier ID] - AND p.[Last Modified When] > s.[Valid From] + WHERE s.[WWI Supplier ID] = p.[WWI Supplier ID] + AND p.[Last Modified When] > s.[Valid From] AND p.[Last Modified When] <= s.[Valid To]), 0), p.[Stock Item Key] = COALESCE((SELECT TOP(1) si.[Stock Item Key] FROM Dimension.[Stock Item] AS si @@ -769,7 +769,7 @@ BEGIN AND p.[Last Modified When] > si.[Valid From] AND p.[Last Modified When] <= si.[Valid To]), 0) FROM Integration.Purchase_Staging AS p; - + -- Remove any existing entries for any of these purchase orders DELETE p @@ -779,20 +779,20 @@ BEGIN -- Insert all current details for these purchase orders INSERT Fact.Purchase - ([Date Key], [Supplier Key], [Stock Item Key], [WWI Purchase Order ID], [Ordered Outers], [Ordered Quantity], + ([Date Key], [Supplier Key], [Stock Item Key], [WWI Purchase Order ID], [Ordered Outers], [Ordered Quantity], [Received Outers], Package, [Is Order Finalized], [Lineage Key]) - SELECT [Date Key], [Supplier Key], [Stock Item Key], [WWI Purchase Order ID], [Ordered Outers], [Ordered Quantity], + SELECT [Date Key], [Supplier Key], [Stock Item Key], [WWI Purchase Order ID], [Ordered Outers], [Ordered Quantity], [Received Outers], Package, [Is Order Finalized], @LineageKey FROM Integration.Purchase_Staging; - - UPDATE Integration.Lineage + + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Purchase'; @@ -818,18 +818,18 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Sale' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Sale' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); -- Find the dimension keys required UPDATE s - SET s.[City Key] = COALESCE((SELECT TOP(1) c.[City Key] + SET s.[City Key] = COALESCE((SELECT TOP(1) c.[City Key] FROM Dimension.City AS c - WHERE c.[WWI City ID] = s.[WWI City ID] - AND s.[Last Modified When] > c.[Valid From] + WHERE c.[WWI City ID] = s.[WWI City ID] + AND s.[Last Modified When] > c.[Valid From] AND s.[Last Modified When] <= c.[Valid To]), 0), s.[Customer Key] = COALESCE((SELECT TOP(1) c.[Customer Key] FROM Dimension.Customer AS c @@ -852,7 +852,7 @@ BEGIN AND s.[Last Modified When] > e.[Valid From] AND s.[Last Modified When] <= e.[Valid To]), 0) FROM Integration.Sale_Staging AS s; - + -- Remove any existing entries for any of these invoices DELETE s @@ -862,22 +862,22 @@ BEGIN -- Insert all current details for these invoices INSERT Fact.Sale - ([City Key], [Customer Key], [Bill To Customer Key], [Stock Item Key], [Invoice Date Key], [Delivery Date Key], - [Salesperson Key], [WWI Invoice ID], [Description], Package, Quantity, [Unit Price], [Tax Rate], + ([City Key], [Customer Key], [Bill To Customer Key], [Stock Item Key], [Invoice Date Key], [Delivery Date Key], + [Salesperson Key], [WWI Invoice ID], [Description], Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], Profit, [Total Including Tax], [Total Dry Items], [Total Chiller Items], [Lineage Key]) - SELECT [City Key], [Customer Key], [Bill To Customer Key], [Stock Item Key], [Invoice Date Key], [Delivery Date Key], - [Salesperson Key], [WWI Invoice ID], [Description], Package, Quantity, [Unit Price], [Tax Rate], + SELECT [City Key], [Customer Key], [Bill To Customer Key], [Stock Item Key], [Invoice Date Key], [Delivery Date Key], + [Salesperson Key], [WWI Invoice ID], [Description], Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], Profit, [Total Including Tax], [Total Dry Items], [Total Chiller Items], @LineageKey FROM Integration.Sale_Staging; - - UPDATE Integration.Lineage + + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Sale'; @@ -901,9 +901,9 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Stock Holding' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Stock Holding' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); -- Find the dimension keys required @@ -914,28 +914,28 @@ BEGIN WHERE si.[WWI Stock Item ID] = s.[WWI Stock Item ID] ORDER BY si.[Valid To] DESC), 0) FROM Integration.StockHolding_Staging AS s; - + -- Remove all existing holdings TRUNCATE TABLE Fact.[Stock Holding]; -- Insert all current stock holdings - INSERT Fact.[Stock Holding] - ([Stock Item Key], [Quantity On Hand], [Bin Location], [Last Stocktake Quantity], + INSERT Fact.[Stock Holding] + ([Stock Item Key], [Quantity On Hand], [Bin Location], [Last Stocktake Quantity], [Last Cost Price], [Reorder Level], [Target Stock Level], [Lineage Key]) - SELECT [Stock Item Key], [Quantity On Hand], [Bin Location], [Last Stocktake Quantity], + SELECT [Stock Item Key], [Quantity On Hand], [Bin Location], [Last Stocktake Quantity], [Last Cost Price], [Reorder Level], [Target Stock Level], @LineageKey FROM Integration.StockHolding_Staging; - - UPDATE Integration.Lineage + + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Stock Holding'; @@ -961,9 +961,9 @@ BEGIN BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] - FROM Integration.Lineage - WHERE [Table Name] = N'Transaction' - AND [Data Load Completed] IS NULL + FROM Integration.Lineage + WHERE [Table Name] = N'Transaction' + AND [Data Load Completed] IS NULL ORDER BY [Lineage Key] DESC); -- Find the dimension keys required @@ -995,28 +995,28 @@ BEGIN AND t.[Last Modified When] > pm.[Valid From] AND t.[Last Modified When] <= pm.[Valid To]), 0) FROM Integration.Transaction_Staging AS t; - + -- Insert all the transactions - INSERT Fact.[Transaction] - ([Date Key], [Customer Key], [Bill To Customer Key], [Supplier Key], [Transaction Type Key], - [Payment Method Key], [WWI Customer Transaction ID], [WWI Supplier Transaction ID], - [WWI Invoice ID], [WWI Purchase Order ID], [Supplier Invoice Number], [Total Excluding Tax], + INSERT Fact.[Transaction] + ([Date Key], [Customer Key], [Bill To Customer Key], [Supplier Key], [Transaction Type Key], + [Payment Method Key], [WWI Customer Transaction ID], [WWI Supplier Transaction ID], + [WWI Invoice ID], [WWI Purchase Order ID], [Supplier Invoice Number], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Outstanding Balance], [Is Finalized], [Lineage Key]) - SELECT [Date Key], [Customer Key], [Bill To Customer Key], [Supplier Key], [Transaction Type Key], - [Payment Method Key], [WWI Customer Transaction ID], [WWI Supplier Transaction ID], - [WWI Invoice ID], [WWI Purchase Order ID], [Supplier Invoice Number], [Total Excluding Tax], + SELECT [Date Key], [Customer Key], [Bill To Customer Key], [Supplier Key], [Transaction Type Key], + [Payment Method Key], [WWI Customer Transaction ID], [WWI Supplier Transaction ID], + [WWI Invoice ID], [WWI Purchase Order ID], [Supplier Invoice Number], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Outstanding Balance], [Is Finalized], @LineageKey FROM Integration.Transaction_Staging; - - UPDATE Integration.Lineage + + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1 WHERE [Lineage Key] = @LineageKey; UPDATE Integration.[ETL Cutoff] - SET [Cutoff Time] = (SELECT [Source System Cutoff Time] - FROM Integration.Lineage + SET [Cutoff Time] = (SELECT [Source System Cutoff Time] + FROM Integration.Lineage WHERE [Lineage Key] = @LineageKey) FROM Integration.[ETL Cutoff] WHERE [Table Name] = N'Transaction'; @@ -1039,8 +1039,8 @@ BEGIN DECLARE @StartingETLCutoffTime datetime2(7) = '20121231'; DECLARE @StartOfTime datetime2(7) = '20130101'; DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - - UPDATE Integration.[ETL Cutoff] + + UPDATE Integration.[ETL Cutoff] SET [Cutoff Time] = @StartingETLCutoffTime; TRUNCATE TABLE Fact.Movement; @@ -1058,25 +1058,25 @@ BEGIN DELETE Dimension.Supplier; DELETE Dimension.[Transaction Type]; - INSERT Dimension.City - ([City Key], [WWI City ID], City, [State Province], Country, Continent, [Sales Territory], Region, Subregion, + INSERT Dimension.City + ([City Key], [WWI City ID], City, [State Province], Country, Continent, [Sales Territory], Region, Subregion, [Location], [Latest Recorded Population], [Valid From], [Valid To], [Lineage Key]) VALUES (0, 0, N'Unknown', N'N/A', N'N/A', N'N/A', N'N/A', N'N/A', N'N/A', NULL, 0, @StartOfTime, @EndOfTime, 0); INSERT Dimension.Customer - ([Customer Key], [WWI Customer ID], [Customer], [Bill To Customer], Category, [Buying Group], + ([Customer Key], [WWI Customer ID], [Customer], [Bill To Customer], Category, [Buying Group], [Primary Contact], [Postal Code], [Valid From], [Valid To], [Lineage Key]) VALUES - (0, 0, N'Unknown', N'N/A', N'N/A', N'N/A', + (0, 0, N'Unknown', N'N/A', N'N/A', N'N/A', N'N/A', N'N/A', @StartOfTime, @EndOfTime, 0); INSERT Dimension.Employee - ([Employee Key], [WWI Employee ID], Employee, [Preferred Name], + ([Employee Key], [WWI Employee ID], Employee, [Preferred Name], [Is Salesperson], Photo, [Valid From], [Valid To], [Lineage Key]) VALUES - (0, 0, N'Unknown', N'N/A', + (0, 0, N'Unknown', N'N/A', 0, NULL, @StartOfTime, @EndOfTime, 0); INSERT Dimension.[Payment Method] @@ -1085,9 +1085,9 @@ BEGIN (0, 0, N'Unknown', @StartOfTime, @EndOfTime, 0); INSERT Dimension.[Stock Item] - ([Stock Item Key], [WWI Stock Item ID], [Stock Item], Color, [Selling Package], [Buying Package], - Brand, Size, [Lead Time Days], [Quantity Per Outer], [Is Chiller Stock], - Barcode, [Tax Rate], [Unit Price], [Recommended Retail Price], [Typical Weight Per Unit], + ([Stock Item Key], [WWI Stock Item ID], [Stock Item], Color, [Selling Package], [Buying Package], + Brand, Size, [Lead Time Days], [Quantity Per Outer], [Is Chiller Stock], + Barcode, [Tax Rate], [Unit Price], [Recommended Retail Price], [Typical Weight Per Unit], Photo, [Valid From], [Valid To], [Lineage Key]) VALUES (0, 0, N'Unknown', N'N/A', N'N/A', N'N/A', @@ -1096,7 +1096,7 @@ BEGIN NULL, @StartOfTime, @EndOfTime, 0); INSERT Dimension.[Supplier] - ([Supplier Key], [WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference], + ([Supplier Key], [WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference], [Payment Days], [Postal Code], [Valid From], [Valid To], [Lineage Key]) VALUES (0, 0, N'Unknown', N'N/A', N'N/A', N'N/A', @@ -1109,7 +1109,7 @@ BEGIN END; GO -DROP PROCEDURE IF EXISTS [Application].Configuration_EnableInMemory; +DROP PROCEDURE IF EXISTS [Application].Configuration_EnableInMemory; GO CREATE PROCEDURE [Application].Configuration_EnableInMemory @@ -1118,9 +1118,9 @@ AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - - IF SERVERPROPERTY(N'IsXTPSupported') = 0 - BEGIN + + IF SERVERPROPERTY(N'IsXTPSupported') = 0 + BEGIN PRINT N'Warning: In-memory tables cannot be created on this edition.'; END ELSE BEGIN -- if in-memory can be created @@ -1137,19 +1137,19 @@ BEGIN IF NOT EXISTS (SELECT 1 FROM sys.filegroups WHERE name = N'WWIDW_InMemory_Data') BEGIN SET @SQL = N' -ALTER DATABASE WideWorldImportersDW +ALTER DATABASE WideWorldImportersDW ADD FILEGROUP WWIDW_InMemory_Data CONTAINS MEMORY_OPTIMIZED_DATA;'; EXECUTE (@SQL); SET @SQL = N' ALTER DATABASE WideWorldImportersDW ADD FILE (name = N''WWIDW_InMemory_Data_1'', filename = ''' - + @MemoryOptimizedFilegroupFolder + N''') + + @MemoryOptimizedFilegroupFolder + N''') TO FILEGROUP WWIDW_InMemory_Data;'; EXECUTE (@SQL); SET @SQL = N' -ALTER DATABASE WideWorldImportersDW +ALTER DATABASE WideWorldImportersDW SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;'; EXECUTE (@SQL); END; @@ -1521,7 +1521,7 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - IF SERVERPROPERTY(N'IsXTPSupported') = 0 -- TODO !! - currently no separate test for columnstore + IF SERVERPROPERTY(N'IsXTPSupported') = 0 -- TODO !! - currently no separate test for columnstore BEGIN -- but same editions with XTP support columnstore PRINT N'Warning: Columnstore indexes cannot be created on this edition.'; END ELSE BEGIN -- if columnstore can be created @@ -1532,22 +1532,22 @@ BEGIN IF NOT EXISTS (SELECT 1 FROM sys.partition_functions WHERE name = N'PF_Date') BEGIN SET @SQL = N' -CREATE PARTITION FUNCTION PF_Date(date) -AS RANGE RIGHT +CREATE PARTITION FUNCTION PF_Date(date) +AS RANGE RIGHT FOR VALUES (N''20120101'',N''20130101'',N''20140101'', N''20150101'', N''20160101'', N''20170101'');'; EXECUTE (@SQL); PRINT N'Created partition function PF_Date'; - END; + END; IF NOT EXISTS (SELECT 1 FROM sys.partition_schemes WHERE name = N'PS_Date') BEGIN SET @SQL = N' CREATE PARTITION SCHEME PS_Date AS PARTITION PF_Date -ALL TO ([PRIMARY]);'; +ALL TO ([USERDATA]);'; EXECUTE (@SQL); PRINT N'Created partition scheme PS_Date'; - END; + END; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'CCX_Fact_Movement') BEGIN @@ -1565,7 +1565,7 @@ DROP INDEX [IX_Integration_Movement_WWI_Stock_Item_Transaction_ID] ON Fact.Movem ALTER TABLE Fact.Movement DROP CONSTRAINT PK_Fact_Movement; -CREATE CLUSTERED INDEX CCX_Fact_Movement +CREATE CLUSTERED INDEX CCX_Fact_Movement ON Fact.Movement ( [Date Key] @@ -1576,53 +1576,53 @@ CREATE CLUSTERED COLUMNSTORE INDEX CCX_Fact_Movement ON Fact.Movement WITH (DROP_EXISTING = ON) ON PS_Date([Date Key]); -ALTER TABLE [Fact].[Movement] -ADD CONSTRAINT [PK_Fact_Movement] PRIMARY KEY NONCLUSTERED +ALTER TABLE [Fact].[Movement] +ADD CONSTRAINT [PK_Fact_Movement] PRIMARY KEY NONCLUSTERED ( [Movement Key], [Date Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Movement_Customer_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Movement_Customer_Key] ON [Fact].[Movement] ( [Customer Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Movement_Date_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Movement_Date_Key] ON [Fact].[Movement] ( [Date Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Movement_Stock_Item_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Movement_Stock_Item_Key] ON [Fact].[Movement] ( [Stock Item Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Movement_Supplier_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Movement_Supplier_Key] ON [Fact].[Movement] ( [Supplier Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Movement_Transaction_Type_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Movement_Transaction_Type_Key] ON [Fact].[Movement] ( - [Transaction Type Key] + [Transaction Type Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [IX_Integration_Movement_WWI_Stock_Item_Transaction_ID] +CREATE NONCLUSTERED INDEX [IX_Integration_Movement_WWI_Stock_Item_Transaction_ID] ON [Fact].[Movement] ( - [WWI Stock Item Transaction ID] + [WWI Stock Item Transaction ID] ) ON PS_Date([Date Key]); @@ -1649,67 +1649,67 @@ CREATE CLUSTERED COLUMNSTORE INDEX CCX_Fact_Order ON Fact.[Order] WITH (DROP_EXISTING = ON) ON PS_Date([Order Date Key]); -ALTER TABLE [Fact].[Order] -ADD CONSTRAINT [PK_Fact_Order] PRIMARY KEY NONCLUSTERED +ALTER TABLE [Fact].[Order] +ADD CONSTRAINT [PK_Fact_Order] PRIMARY KEY NONCLUSTERED ( [Order Key], [Order Date Key] ) ON PS_Date([Order Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Order_City_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Order_City_Key] ON [Fact].[Order] ( [City Key] ) ON PS_Date([Order Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Order_Customer_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Order_Customer_Key] ON [Fact].[Order] ( - [Customer Key] + [Customer Key] ) ON PS_Date([Order Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Order_Order_Date_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Order_Order_Date_Key] ON [Fact].[Order] ( - [Order Date Key] + [Order Date Key] ) ON PS_Date([Order Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Order_Picked_Date_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Order_Picked_Date_Key] ON [Fact].[Order] ( - [Picked Date Key] + [Picked Date Key] ) ON PS_Date([Order Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Order_Picker_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Order_Picker_Key] ON [Fact].[Order] ( [Picker Key] ASC ) ON PS_Date([Order Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Order_Salesperson_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Order_Salesperson_Key] ON [Fact].[Order] ( - [Salesperson Key] + [Salesperson Key] ) ON PS_Date([Order Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Order_Stock_Item_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Order_Stock_Item_Key] ON [Fact].[Order] ( - [Stock Item Key] + [Stock Item Key] ) ON PS_Date([Order Date Key]); -CREATE NONCLUSTERED INDEX [IX_Integration_Order_WWI_Order_ID] +CREATE NONCLUSTERED INDEX [IX_Integration_Order_WWI_Order_ID] ON [Fact].[Order] ( - [WWI Order ID] + [WWI Order ID] ) ON PS_Date([Order Date Key]); @@ -1731,32 +1731,32 @@ CREATE CLUSTERED COLUMNSTORE INDEX CCX_Fact_Purchase ON Fact.Purchase WITH (DROP_EXISTING = ON) ON PS_Date([Date Key]); -ALTER TABLE Fact.Purchase -ADD CONSTRAINT [PK_Fact_Purchase] PRIMARY KEY NONCLUSTERED +ALTER TABLE Fact.Purchase +ADD CONSTRAINT [PK_Fact_Purchase] PRIMARY KEY NONCLUSTERED ( [Purchase Key], [Date Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Purchase_Date_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Purchase_Date_Key] ON [Fact].[Purchase] ( [Date Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Purchase_Stock_Item_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Purchase_Stock_Item_Key] ON [Fact].[Purchase] ( [Stock Item Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Purchase_Supplier_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Purchase_Supplier_Key] ON [Fact].[Purchase] ( - [Supplier Key] + [Supplier Key] ) ON PS_Date([Date Key]); @@ -1782,67 +1782,67 @@ CREATE CLUSTERED COLUMNSTORE INDEX CCX_Fact_Sale ON Fact.Sale WITH (DROP_EXISTING = ON) ON PS_Date([Invoice Date Key]); -ALTER TABLE Fact.Sale -ADD CONSTRAINT [PK_Fact_Sale] PRIMARY KEY NONCLUSTERED +ALTER TABLE Fact.Sale +ADD CONSTRAINT [PK_Fact_Sale] PRIMARY KEY NONCLUSTERED ( [Sale Key], [Invoice Date Key] ) ON PS_Date([Invoice Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Bill_To_Customer_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Bill_To_Customer_Key] ON [Fact].[Sale] ( [Bill To Customer Key] ) ON PS_Date([Invoice Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Sale_City_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Sale_City_Key] ON [Fact].[Sale] ( [City Key] ) ON PS_Date([Invoice Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Customer_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Customer_Key] ON [Fact].[Sale] ( - [Customer Key] + [Customer Key] ) ON PS_Date([Invoice Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Delivery_Date_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Delivery_Date_Key] ON [Fact].[Sale] ( - [Delivery Date Key] + [Delivery Date Key] ) ON PS_Date([Invoice Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Invoice_Date_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Invoice_Date_Key] ON [Fact].[Sale] ( [Invoice Date Key] ) ON PS_Date([Invoice Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Salesperson_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Salesperson_Key] ON [Fact].[Sale] ( - [Salesperson Key] + [Salesperson Key] ) ON PS_Date([Invoice Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Stock_Item_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Stock_Item_Key] ON [Fact].[Sale] ( - [Stock Item Key] + [Stock Item Key] ) ON PS_Date([Invoice Date Key]); ALTER TABLE Fact.[Stock Holding] DROP CONSTRAINT PK_Fact_Stock_Holding; -ALTER TABLE Fact.[Stock Holding] +ALTER TABLE Fact.[Stock Holding] ADD CONSTRAINT PK_Fact_Stock_Holding PRIMARY KEY NONCLUSTERED ([Stock Holding Key]); CREATE CLUSTERED COLUMNSTORE INDEX CCX_Fact_Stock_Holding @@ -1869,53 +1869,53 @@ CREATE CLUSTERED COLUMNSTORE INDEX CCX_Fact_Transaction ON Fact.[Transaction] WITH (DROP_EXISTING = ON) ON PS_Date([Date Key]); -ALTER TABLE Fact.[Transaction] -ADD CONSTRAINT [PK_Fact_Transaction] PRIMARY KEY NONCLUSTERED +ALTER TABLE Fact.[Transaction] +ADD CONSTRAINT [PK_Fact_Transaction] PRIMARY KEY NONCLUSTERED ( [Transaction Key], [Date Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Bill_To_Customer_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Bill_To_Customer_Key] ON [Fact].[Transaction] ( - [Bill To Customer Key] + [Bill To Customer Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Customer_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Customer_Key] ON [Fact].[Transaction] ( - [Customer Key] + [Customer Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Date_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Date_Key] ON [Fact].[Transaction] ( - [Date Key] + [Date Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Payment_Method_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Payment_Method_Key] ON [Fact].[Transaction] ( - [Payment Method Key] + [Payment Method Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Supplier_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Supplier_Key] ON [Fact].[Transaction] ( - [Supplier Key] + [Supplier Key] ) ON PS_Date([Date Key]); -CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Transaction_Type_Key] +CREATE NONCLUSTERED INDEX [FK_Fact_Transaction_Transaction_Type_Key] ON [Fact].[Transaction] ( - [Transaction Type Key] + [Transaction Type Key] ) ON PS_Date([Date Key]);'; EXECUTE (@SQL); @@ -1923,7 +1923,7 @@ ON PS_Date([Date Key]);'; COMMIT; PRINT N'Applied partitioned columnstore indexing'; - END; + END; END TRY BEGIN CATCH @@ -1942,9 +1942,9 @@ AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - - IF SERVERPROPERTY(N'IsPolybaseInstalled') = 0 - BEGIN + + IF SERVERPROPERTY(N'IsPolybaseInstalled') = 0 + BEGIN PRINT N'Warning: Either Polybase cannot be created on this edition or it has not been installed.'; END ELSE BEGIN -- if installed IF (SELECT value FROM sys.configurations WHERE name = 'hadoop connectivity') NOT IN (1, 4, 7) @@ -1957,19 +1957,19 @@ BEGIN BEGIN TRY SET @SQL = N' -CREATE EXTERNAL DATA SOURCE AzureStorage -WITH +CREATE EXTERNAL DATA SOURCE AzureStorage +WITH ( TYPE=HADOOP, LOCATION = ''wasbs://data@sqldwdatasets.blob.core.windows.net'' );'; EXECUTE (@SQL); SET @SQL = N' -CREATE EXTERNAL FILE FORMAT CommaDelimitedTextFileFormat -WITH +CREATE EXTERNAL FILE FORMAT CommaDelimitedTextFileFormat +WITH ( - FORMAT_TYPE = DELIMITEDTEXT, - FORMAT_OPTIONS + FORMAT_TYPE = DELIMITEDTEXT, + FORMAT_OPTIONS ( FIELD_TERMINATOR = '','' ) @@ -1985,9 +1985,9 @@ CREATE EXTERNAL TABLE dbo.CityPopulationStatistics YearNumber int NOT NULL, LatestRecordedPopulation bigint NULL ) -WITH -( - LOCATION = ''/'', +WITH +( + LOCATION = ''/'', DATA_SOURCE = AzureStorage, FILE_FORMAT = CommaDelimitedTextFileFormat, REJECT_TYPE = VALUE, @@ -2031,15 +2031,15 @@ AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - + EXEC Integration.PopulateDateDimensionForYear 2012; DECLARE @ReturnValue int; EXEC @ReturnValue = [Application].Configuration_ApplyPartitionedColumnstoreIndexing; DECLARE @LineageKey int = NEXT VALUE FOR Sequences.LineageKey; - INSERT Integration.Lineage - ([Lineage Key], [Data Load Started], [Table Name], [Data Load Completed], [Was Successful], + INSERT Integration.Lineage + ([Lineage Key], [Data Load Started], [Table Name], [Data Load Completed], [Was Successful], [Source System Cutoff Time]) VALUES (@LineageKey, SYSDATETIME(), N'Sale', NULL, 0, '20121231') @@ -2082,24 +2082,24 @@ BEGIN BEGIN SET @OutputCounter = CONVERT(varchar(20), @DateCounter, 112); RAISERROR(@OutputCounter, 0, 1) WITH NOWAIT; - + SET @StartingSaleKey = @MaximumSaleKey - @NumberOfSalesPerDay - FLOOR(RAND() * 20000); SET @OrderCounter = 0; - + INSERT Fact.Sale WITH (TABLOCK) - ([City Key], [Customer Key], [Bill To Customer Key], [Stock Item Key], [Invoice Date Key], - [Delivery Date Key], [Salesperson Key], [WWI Invoice ID], [Description], - Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], - [Tax Amount], Profit, [Total Including Tax], [Total Dry Items], [Total Chiller Items], + ([City Key], [Customer Key], [Bill To Customer Key], [Stock Item Key], [Invoice Date Key], + [Delivery Date Key], [Salesperson Key], [WWI Invoice ID], [Description], + Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], + [Tax Amount], Profit, [Total Including Tax], [Total Dry Items], [Total Chiller Items], [Lineage Key]) - SELECT TOP(@NumberOfSalesPerDay) - [City Key], [Customer Key], [Bill To Customer Key], [Stock Item Key], @DateCounter, - DATEADD(day, 1, @DateCounter), [Salesperson Key], [WWI Invoice ID], [Description], - Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], - [Tax Amount], Profit, [Total Including Tax], [Total Dry Items], [Total Chiller Items], - @LineageKey - FROM Fact.Sale - WHERE [Sale Key] > @StartingSaleKey + SELECT TOP(@NumberOfSalesPerDay) + [City Key], [Customer Key], [Bill To Customer Key], [Stock Item Key], @DateCounter, + DATEADD(day, 1, @DateCounter), [Salesperson Key], [WWI Invoice ID], [Description], + Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], + [Tax Amount], Profit, [Total Including Tax], [Total Dry Items], [Total Chiller Items], + @LineageKey + FROM Fact.Sale + WHERE [Sale Key] > @StartingSaleKey and [Invoice Date Key] >='2013-01-01' ORDER BY [Sale Key]; @@ -2108,68 +2108,68 @@ BEGIN RAISERROR('Compressing all open Rowgroups', 0, 1) WITH NOWAIT; - ALTER INDEX CCX_Fact_Sale - ON Fact.Sale + ALTER INDEX CCX_Fact_Sale + ON Fact.Sale REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON); - UPDATE Integration.Lineage + UPDATE Integration.Lineage SET [Data Load Completed] = SYSDATETIME(), [Was Successful] = 1; -- Add back Constraints RAISERROR('Adding Constraints', 0, 1) WITH NOWAIT; - ALTER TABLE [Fact].[Sale] - ADD CONSTRAINT [PK_Fact_Sale] PRIMARY KEY NONCLUSTERED + ALTER TABLE [Fact].[Sale] + ADD CONSTRAINT [PK_Fact_Sale] PRIMARY KEY NONCLUSTERED ( [Sale Key] ASC, [Invoice Date Key] ASC ); - ALTER TABLE [Fact].[Sale] - WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Bill_To_Customer_Key_Dimension_Customer] + ALTER TABLE [Fact].[Sale] + WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Bill_To_Customer_Key_Dimension_Customer] FOREIGN KEY([Bill To Customer Key]) REFERENCES [Dimension].[Customer] ([Customer Key]); ALTER TABLE [Fact].[Sale] CHECK CONSTRAINT [FK_Fact_Sale_Bill_To_Customer_Key_Dimension_Customer]; - - ALTER TABLE [Fact].[Sale] - WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Stock_Item_Key_Dimension_Stock Item] + + ALTER TABLE [Fact].[Sale] + WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Stock_Item_Key_Dimension_Stock Item] FOREIGN KEY([Stock Item Key]) REFERENCES [Dimension].[Stock Item] ([Stock Item Key]); ALTER TABLE [Fact].[Sale] CHECK CONSTRAINT [FK_Fact_Sale_Stock_Item_Key_Dimension_Stock Item]; - ALTER TABLE [Fact].[Sale] - WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Salesperson_Key_Dimension_Employee] + ALTER TABLE [Fact].[Sale] + WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Salesperson_Key_Dimension_Employee] FOREIGN KEY([Salesperson Key]) REFERENCES [Dimension].[Employee] ([Employee Key]); ALTER TABLE [Fact].[Sale] CHECK CONSTRAINT [FK_Fact_Sale_Salesperson_Key_Dimension_Employee]; - ALTER TABLE [Fact].[Sale] - WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Invoice_Date_Key_Dimension_Date] + ALTER TABLE [Fact].[Sale] + WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Invoice_Date_Key_Dimension_Date] FOREIGN KEY([Invoice Date Key]) REFERENCES [Dimension].[Date] ([Date]); ALTER TABLE [Fact].[Sale] CHECK CONSTRAINT [FK_Fact_Sale_Invoice_Date_Key_Dimension_Date]; - ALTER TABLE [Fact].[Sale] - WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Delivery_Date_Key_Dimension_Date] + ALTER TABLE [Fact].[Sale] + WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Delivery_Date_Key_Dimension_Date] FOREIGN KEY([Delivery Date Key]) REFERENCES [Dimension].[Date] ([Date]); ALTER TABLE [Fact].[Sale] CHECK CONSTRAINT [FK_Fact_Sale_Delivery_Date_Key_Dimension_Date]; - ALTER TABLE [Fact].[Sale] - WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Customer_Key_Dimension_Customer] + ALTER TABLE [Fact].[Sale] + WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_Customer_Key_Dimension_Customer] FOREIGN KEY([Customer Key]) REFERENCES [Dimension].[Customer] ([Customer Key]); ALTER TABLE [Fact].[Sale] CHECK CONSTRAINT [FK_Fact_Sale_Customer_Key_Dimension_Customer]; - ALTER TABLE [Fact].[Sale] - WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_City_Key_Dimension_City] + ALTER TABLE [Fact].[Sale] + WITH CHECK ADD CONSTRAINT [FK_Fact_Sale_City_Key_Dimension_City] FOREIGN KEY([City Key]) REFERENCES [Dimension].[City] ([City Key]); @@ -2181,9 +2181,9 @@ BEGIN CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Invoice_Date_Key] ON [Fact].[Sale] ([Invoice Date Key] ASC); CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Delivery_Date_Key] ON [Fact].[Sale] ([Delivery Date Key] ASC); CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Bill_To_Customer_Key] ON [Fact].[Sale] ([Bill To Customer Key] ASC); - CREATE NONCLUSTERED INDEX [FK_Fact_Sale_City_Key] ON [Fact].[Sale] ([City Key] ASC); + CREATE NONCLUSTERED INDEX [FK_Fact_Sale_City_Key] ON [Fact].[Sale] ([City Key] ASC); CREATE NONCLUSTERED INDEX [FK_Fact_Sale_Customer_Key] ON [Fact].[Sale] ([Customer Key] ASC); - + RETURN 0; END; GO From d46bc4bc2452996de697d7bc4de91381392fff3c Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 09:45:56 -0700 Subject: [PATCH 09/73] removing compression from history table for standard edition --- .../2-wwi-construct-database-from-metadata-tables.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql b/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql index 2ada9ba7..0ab4fd02 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql @@ -359,7 +359,8 @@ BEGIN SET @SQL += @CrLf + N'WITH ' + @CrLf + N'(' + @CrLf + @Indent + N'SYSTEM_VERSIONING = ON (HISTORY_TABLE = ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName + N'_' + @TemporalTableSuffix) + N')' + @CrLf - + N')'; + + N');' + @CrLf; + + N'ALTER INDEX ix_' + @TableName + N'_' + @TemporalTableSuffix + N'ON ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName + N'_' + @TemporalTableSuffix) + N' REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE)' END; SET @SQL += N';' + @CrLf + @GO; From 861a45437c12adabbcd41f3f5041c4c0cdc9a308 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:09:40 -0700 Subject: [PATCH 10/73] Delete .suo --- .../MultithreadedInMemoryTableInsert/v14/.suo | Bin 30208 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/.vs/MultithreadedInMemoryTableInsert/v14/.suo diff --git a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/.vs/MultithreadedInMemoryTableInsert/v14/.suo b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/.vs/MultithreadedInMemoryTableInsert/v14/.suo deleted file mode 100644 index 1f40f9792e3c518da55410bc5c810aa202d0486e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30208 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 j#C6Kk>E7S}^~ZyWe}3stZ+!W=)Z*Dcyw)jit9$ Date: Thu, 2 Jun 2016 10:17:50 -0700 Subject: [PATCH 11/73] Update README.md --- samples/README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/samples/README.md b/samples/README.md index e6ddaa7c..1e0e0063 100644 --- a/samples/README.md +++ b/samples/README.md @@ -1,5 +1,17 @@ # Sample Categories +__[applications] (applications/)__ + +End-to-end sample applications that illustrate the use of SQL Server for specific application scenarios. + +__[databases] (databases/)__ + +Sample databases for SQL Server, Azure SQL Database, and Azure SQL Data Warehouse. + __[features] (features/)__ -Contains samples illustrating specific SQL Server and Azure SQL Database features, including In-Memory OLTP, Master Data Services (MDS), and R Services. +Samples illustrating specific SQL Server and Azure SQL Database features, including In-Memory OLTP, Master Data Services (MDS), and R Services. + +__[management] (management/)__ + +Samples that help with the management of SQL Server and Azure SQL Database. From b754ec132589e21211b13a74f5df69360a659a9f Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:18:39 -0700 Subject: [PATCH 12/73] Update README.md --- samples/databases/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/README.md b/samples/databases/README.md index a96b72df..6c508490 100644 --- a/samples/databases/README.md +++ b/samples/databases/README.md @@ -4,7 +4,7 @@ Contains samples databases for Microsoft's SQL databases include SQL Server, Azu __[world-wide-importers](world-wide-importers/)__ -The new sample database for SQL Server 2016 and Azure SQL Database. It illustrates best practices in database design, as well as the core capabilities of SQL Server 2016 and Azure SQL Database, for transaction processing (OLTP), data warehousing and analytics (OLAP) workloads, as well as hybrid transaction and analytics processing (HTAP) workloads. +The new sample database for SQL Server 2016 and Azure SQL Database. It illustrates the core capabilities of SQL Server 2016 and Azure SQL Database, for transaction processing (OLTP), data warehousing and analytics (OLAP) workloads, as well as hybrid transaction and analytics processing (HTAP) workloads. __[contoso-data-warehouse](contoso-data-warehouse/)__ From fbc0a4f5b3bd265388e7796cd5613245a7cbae4a Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:19:18 -0700 Subject: [PATCH 13/73] Update README.md --- samples/databases/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/README.md b/samples/databases/README.md index 6c508490..0f959213 100644 --- a/samples/databases/README.md +++ b/samples/databases/README.md @@ -2,7 +2,7 @@ Contains samples databases for Microsoft's SQL databases include SQL Server, Azure SQL Database, and Azure SQL Data Warehouse. -__[world-wide-importers](world-wide-importers/)__ +__[wide-world-importers](wide-world-importers/)__ The new sample database for SQL Server 2016 and Azure SQL Database. It illustrates the core capabilities of SQL Server 2016 and Azure SQL Database, for transaction processing (OLTP), data warehousing and analytics (OLAP) workloads, as well as hybrid transaction and analytics processing (HTAP) workloads. From e86cf65e090edc3de81e7d6e44b3b3b820b9b3bf Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:20:34 -0700 Subject: [PATCH 14/73] Delete readme.md cleaning up --- samples/in-memory/ticket-reservations/readme.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 samples/in-memory/ticket-reservations/readme.md diff --git a/samples/in-memory/ticket-reservations/readme.md b/samples/in-memory/ticket-reservations/readme.md deleted file mode 100644 index cb9d7ee4..00000000 --- a/samples/in-memory/ticket-reservations/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -This content was moved: - -[features/in-memory/ticket-reservations] (/samples/features/in-memory/ticket-reservations/) From 0ad9cd9b7afc14a867c4947ba71e20a3b58a6fdf Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:20:46 -0700 Subject: [PATCH 15/73] Delete readme.md cleaning up --- samples/master-data-services/readme.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 samples/master-data-services/readme.md diff --git a/samples/master-data-services/readme.md b/samples/master-data-services/readme.md deleted file mode 100644 index e0d87811..00000000 --- a/samples/master-data-services/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -This content was moved: - -[samples/features/master-data-services/](/samples/features/master-data-services/) From b3cb205d40e9499cb2266ecac1681cecb12b679c Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:20:57 -0700 Subject: [PATCH 16/73] Delete readme.md cleaning up --- samples/r-services/readme.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 samples/r-services/readme.md diff --git a/samples/r-services/readme.md b/samples/r-services/readme.md deleted file mode 100644 index c0613c3b..00000000 --- a/samples/r-services/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -Content was moved to: - -[samples/features/r-services/](/samples/features/r-services/) From 3f2caffb0646498c72367a56eeb57f3030a7475f Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:22:37 -0700 Subject: [PATCH 17/73] Update README.md --- samples/databases/wide-world-importers/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/samples/databases/wide-world-importers/README.md b/samples/databases/wide-world-importers/README.md index 04cb77b7..0d3f1e77 100644 --- a/samples/databases/wide-world-importers/README.md +++ b/samples/databases/wide-world-importers/README.md @@ -6,6 +6,10 @@ WideWorldImporters is a wholesale company. Transactions and real-time analytics The sample includes the databases that can be explored, as well as sample applications and sample scripts that can be used to explore the use of individual SQL Server features in the sample database. +**Latest release**: [wide-world-importers-v0.1](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v0.1) + +**Documentation**: [root.md](documentation/root.md) + ### Contents [About this sample](#about-this-sample)
From 9409b44c3359bbf91eece50e9f77849c3b2d28fd Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:23:50 -0700 Subject: [PATCH 18/73] Update root.md --- .../databases/wide-world-importers/documentation/root.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/samples/databases/wide-world-importers/documentation/root.md b/samples/databases/wide-world-importers/documentation/root.md index da340e3f..91377dd1 100644 --- a/samples/databases/wide-world-importers/documentation/root.md +++ b/samples/databases/wide-world-importers/documentation/root.md @@ -4,12 +4,12 @@ Wide World Importers is a comprehensive database sample that both illustrates da Note that the sample is meant to be representative of a typical database. It does not include every feature of SQL Server. The design of the database follows one common set of standards, but there are many ways one might build a database. -The source code for the sample can be found on the SQL Server Samples GitHub repository: -[wide-world-importers](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers). - -The latest released version of the sample: +**Latest release**: [wide-world-importers-v0.1](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v0.1) +**Source code for the sample**: +[wide-world-importers](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers). + The documentation for the sample is organized as follows: ## Overview From 5c8a1d24b45cf326e1a264386a21558bb57e8d8d Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:41:11 -0700 Subject: [PATCH 19/73] Update root.md added fwlink for release --- samples/databases/wide-world-importers/documentation/root.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/documentation/root.md b/samples/databases/wide-world-importers/documentation/root.md index 91377dd1..0c2341fb 100644 --- a/samples/databases/wide-world-importers/documentation/root.md +++ b/samples/databases/wide-world-importers/documentation/root.md @@ -5,7 +5,7 @@ Wide World Importers is a comprehensive database sample that both illustrates da Note that the sample is meant to be representative of a typical database. It does not include every feature of SQL Server. The design of the database follows one common set of standards, but there are many ways one might build a database. **Latest release**: -[wide-world-importers-v0.1](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v0.1) +[wide-world-importers-release](http://go.microsoft.com/fwlink/?LinkID=800630) **Source code for the sample**: [wide-world-importers](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers). From adc9c7757ad714c43ffa02abeb952b42b4ff2bc2 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:42:04 -0700 Subject: [PATCH 20/73] Update README.md added fwlinks --- samples/databases/wide-world-importers/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/databases/wide-world-importers/README.md b/samples/databases/wide-world-importers/README.md index 0d3f1e77..a18f446d 100644 --- a/samples/databases/wide-world-importers/README.md +++ b/samples/databases/wide-world-importers/README.md @@ -6,9 +6,9 @@ WideWorldImporters is a wholesale company. Transactions and real-time analytics The sample includes the databases that can be explored, as well as sample applications and sample scripts that can be used to explore the use of individual SQL Server features in the sample database. -**Latest release**: [wide-world-importers-v0.1](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v0.1) +**Latest release**: [wide-world-importers-release](http://go.microsoft.com/fwlink/?LinkID=800630) -**Documentation**: [root.md](documentation/root.md) +**Documentation**: [root.md](http://go.microsoft.com/fwlink/?LinkID=800631) ### Contents From 394dfe81ca74c6ba06402a4d2442fd51e67a47aa Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:43:19 -0700 Subject: [PATCH 21/73] Update wwi-oltp-htap-installation.md added fwlink --- .../documentation/wwi-oltp-htap-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md index 0b4735c9..8b7d3596 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md +++ b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md @@ -9,7 +9,7 @@ The latest release of the sample: -[wide-world-importers-v0.1](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v0.1) +[wide-world-importers-release](http://go.microsoft.com/fwlink/?LinkID=800630) Download the sample WideWorldImporters database backup/bacpac that corresponds to your edition of SQL Server or Azure SQL Database. From 33ed5369eb9dda2030ae60a8de2643e99c421ca3 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 10:43:58 -0700 Subject: [PATCH 22/73] Update wwi-olap-installation.md added fwlink --- .../wide-world-importers/documentation/wwi-olap-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md b/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md index 60b6108b..df413289 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md +++ b/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md @@ -8,7 +8,7 @@ The latest release of the sample: -[wide-world-importers-v0.1](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v0.1) +[wide-world-importers-release](http://go.microsoft.com/fwlink/?LinkID=800630) Download the sample WideWorldImportersDW database backup/bacpac that corresponds to your edition of SQL Server or Azure SQL Database. From 91d954497ceb4fd3e58e36d208ba0bd612be3813 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Thu, 2 Jun 2016 12:29:56 -0700 Subject: [PATCH 23/73] fixes in scripts --- .gitignore | 9 +++- ...onstruct-database-from-metadata-tables.sql | 4 +- .../wwi-database-scripts/3-wwi-recreate.sql | 45 +++++++++++++++++- ...wi-configure-required-database-objects.sql | 6 +-- .../5-wwi-load-seed-data.sql | 4 -- .../6-wwi-data-simulation.sql | Bin 1328 -> 1252 bytes .../7-wwi-enable-full-features.sql | 2 +- .../3-wwi-dw-recreate.sql | 29 ++++++++++- .../6-wwi-dw-enable-full-features.sql | Bin 430 -> 434 bytes 9 files changed, 83 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 79d24733..254d5795 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ samples/in-memory/ticket-reservations/DemoWorkload/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs *.nupkg -samples/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/CreatePackageFile.bat \ No newline at end of file +samples/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/CreatePackageFile.bat +*.suo +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.exe +*.pdb +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe +*.Cache +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.exe.config +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs \ No newline at end of file diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql b/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql index 0ab4fd02..c652d829 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql @@ -359,8 +359,8 @@ BEGIN SET @SQL += @CrLf + N'WITH ' + @CrLf + N'(' + @CrLf + @Indent + N'SYSTEM_VERSIONING = ON (HISTORY_TABLE = ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName + N'_' + @TemporalTableSuffix) + N')' + @CrLf - + N');' + @CrLf; - + N'ALTER INDEX ix_' + @TableName + N'_' + @TemporalTableSuffix + N'ON ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName + N'_' + @TemporalTableSuffix) + N' REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE)' + + N');' + @CrLf + + N'ALTER INDEX ix_' + @TableName + N'_' + @TemporalTableSuffix + N' ON ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName + N'_' + @TemporalTableSuffix) + N' REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE)'; END; SET @SQL += N';' + @CrLf + @GO; diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql b/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql index b6bb2443..4ebebd2b 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql @@ -8,13 +8,39 @@ END; GO CREATE DATABASE WideWorldImporters - +ON PRIMARY +( + NAME = WWI_Primary, + FILENAME = 'D:\Data\WideWorldImporters.mdf', + SIZE = 1GB, + MAXSIZE = UNLIMITED, + FILEGROWTH = 64MB +), +FILEGROUP USERDATA DEFAULT +( + NAME = WWI_UserData, + FILENAME = 'D:\Data\WideWorldImporters_UserData.ndf', + SIZE = 2GB, + MAXSIZE = UNLIMITED, + FILEGROWTH = 64MB +) +LOG ON +( + NAME = WWI_Log, + FILENAME = 'E:\Log\WideWorldImporters.ldf', + SIZE = 100MB, + MAXSIZE = UNLIMITED, + FILEGROWTH = 64MB +) COLLATE Latin1_General_100_CI_AS; GO ALTER DATABASE WideWorldImporters SET RECOVERY SIMPLE; GO +ALTER DATABASE WideWorldImporters SET AUTO_UPDATE_STATISTICS_ASYNC ON; +GO + ALTER AUTHORIZATION ON DATABASE::WideWorldImporters to sa; GO @@ -148,6 +174,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Application].[People_Archive]) ); +ALTER INDEX ix_People_Archive ON [Application].[People_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO CREATE INDEX [IX_Application_People_IsEmployee] @@ -212,6 +239,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Warehouse].[ColdRoomTemperatures_Archive]) ); +ALTER INDEX ix_ColdRoomTemperatures_Archive ON [Warehouse].[ColdRoomTemperatures_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Regularly recorded temperatures of cold room chillers', @level0type = N'SCHEMA', @level0name = 'Warehouse', @level1type = N'TABLE', @level1name = 'ColdRoomTemperatures'; @@ -277,6 +305,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Application].[Countries_Archive]) ); +ALTER INDEX ix_Countries_Archive ON [Application].[Countries_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Countries that contain the states or provinces (including geographic boundaries)', @level0type = N'SCHEMA', @level0name = 'Application', @level1type = N'TABLE', @level1name = 'Countries'; @@ -313,6 +342,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Application].[DeliveryMethods_Archive]) ); +ALTER INDEX ix_DeliveryMethods_Archive ON [Application].[DeliveryMethods_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Ways that stock items can be delivered (ie: truck/van, post, pickup, courier, etc.', @level0type = N'SCHEMA', @level0name = 'Application', @level1type = N'TABLE', @level1name = 'DeliveryMethods'; @@ -340,6 +370,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Application].[PaymentMethods_Archive]) ); +ALTER INDEX ix_PaymentMethods_Archive ON [Application].[PaymentMethods_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Ways that payments can be made (ie: cash, check, EFT, etc.', @level0type = N'SCHEMA', @level0name = 'Application', @level1type = N'TABLE', @level1name = 'PaymentMethods'; @@ -367,6 +398,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Application].[TransactionTypes_Archive]) ); +ALTER INDEX ix_TransactionTypes_Archive ON [Application].[TransactionTypes_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Types of customer, supplier, or stock transactions (ie: invoice, credit note, etc.)', @level0type = N'SCHEMA', @level0name = 'Application', @level1type = N'TABLE', @level1name = 'TransactionTypes'; @@ -394,6 +426,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Purchasing].[SupplierCategories_Archive]) ); +ALTER INDEX ix_SupplierCategories_Archive ON [Purchasing].[SupplierCategories_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Categories for suppliers (ie novelties, toys, clothing, packaging, etc.)', @level0type = N'SCHEMA', @level0name = 'Purchasing', @level1type = N'TABLE', @level1name = 'SupplierCategories'; @@ -421,6 +454,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Sales].[BuyingGroups_Archive]) ); +ALTER INDEX ix_BuyingGroups_Archive ON [Sales].[BuyingGroups_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Customer organizations can be part of groups that exert greater buying power', @level0type = N'SCHEMA', @level0name = 'Sales', @level1type = N'TABLE', @level1name = 'BuyingGroups'; @@ -448,6 +482,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Sales].[CustomerCategories_Archive]) ); +ALTER INDEX ix_CustomerCategories_Archive ON [Sales].[CustomerCategories_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Categories for customers (ie restaurants, cafes, supermarkets, etc.)', @level0type = N'SCHEMA', @level0name = 'Sales', @level1type = N'TABLE', @level1name = 'CustomerCategories'; @@ -475,6 +510,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Warehouse].[Colors_Archive]) ); +ALTER INDEX ix_Colors_Archive ON [Warehouse].[Colors_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Stock items can (optionally) have colors', @level0type = N'SCHEMA', @level0name = 'Warehouse', @level1type = N'TABLE', @level1name = 'Colors'; @@ -502,6 +538,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Warehouse].[PackageTypes_Archive]) ); +ALTER INDEX ix_PackageTypes_Archive ON [Warehouse].[PackageTypes_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Ways that stock items can be packaged (ie: each, box, carton, pallet, kg, etc.', @level0type = N'SCHEMA', @level0name = 'Warehouse', @level1type = N'TABLE', @level1name = 'PackageTypes'; @@ -529,6 +566,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Warehouse].[StockGroups_Archive]) ); +ALTER INDEX ix_StockGroups_Archive ON [Warehouse].[StockGroups_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Groups for categorizing stock items (ie: novelties, toys, edible novelties, etc.)', @level0type = N'SCHEMA', @level0name = 'Warehouse', @level1type = N'TABLE', @level1name = 'StockGroups'; @@ -563,6 +601,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Application].[StateProvinces_Archive]) ); +ALTER INDEX ix_StateProvinces_Archive ON [Application].[StateProvinces_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO CREATE INDEX [FK_Application_StateProvinces_CountryID] @@ -610,6 +649,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Application].[Cities_Archive]) ); +ALTER INDEX ix_Cities_Archive ON [Application].[Cities_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO CREATE INDEX [FK_Application_Cities_StateProvinceID] @@ -733,6 +773,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Purchasing].[Suppliers_Archive]) ); +ALTER INDEX ix_Suppliers_Archive ON [Purchasing].[Suppliers_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO CREATE INDEX [FK_Purchasing_Suppliers_SupplierCategoryID] @@ -866,6 +907,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Sales].[Customers_Archive]) ); +ALTER INDEX ix_Customers_Archive ON [Sales].[Customers_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO CREATE INDEX [FK_Sales_Customers_CustomerCategoryID] @@ -1102,6 +1144,7 @@ WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Warehouse].[StockItems_Archive]) ); +ALTER INDEX ix_StockItems_Archive ON [Warehouse].[StockItems_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO CREATE INDEX [FK_Warehouse_StockItems_SupplierID] diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql index 1007f228..6d417079 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql @@ -4010,8 +4010,7 @@ EXEC dbo.sp_rename @objname = N''Warehouse.VehicleTemperatures'', SET @SQL = N' CREATE TABLE Warehouse.VehicleTemperatures ( - VehicleTemperatureID bigint IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + VehicleTemperatureID bigint IDENTITY(1,1) NOT NULL, VehicleRegistration nvarchar(20) COLLATE Latin1_General_CI_AS NOT NULL, ChillerSensorNumber int NOT NULL, RecordedWhen datetime2(7) NOT NULL, @@ -6137,9 +6136,6 @@ BEGIN END; GO -USE tempdb; -GO - /* -- initial data population to ship date diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/5-wwi-load-seed-data.sql b/samples/databases/wide-world-importers/wwi-database-scripts/5-wwi-load-seed-data.sql index 0927cfa3..9a837ccd 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/5-wwi-load-seed-data.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/5-wwi-load-seed-data.sql @@ -59121,7 +59121,3 @@ GO EXEC Sequences.ReseedAllSequences; GO -USE tempdb; -GO - - diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/6-wwi-data-simulation.sql b/samples/databases/wide-world-importers/wwi-database-scripts/6-wwi-data-simulation.sql index 64db4f50b788cb22af6a5606c18ac9036e8592e6..5c4972a0f87e26de2d8dc318c20fbba81df49d11 100644 GIT binary patch delta 42 vcmdnM^@MXm1Ea~r#?Hx~SX3sTV3C_##25r-^D!-9HDxenFxq841zE Date: Thu, 2 Jun 2016 12:35:13 -0700 Subject: [PATCH 24/73] fix --- .../4-wwi-configure-required-database-objects.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql index 6d417079..4f90945a 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql @@ -4637,7 +4637,7 @@ ALL TO ([USERDATA]);'; SET @SQL = N' CREATE PARTITION SCHEME PS_TransactionDate AS PARTITION PF_TransactionDate -ALL TO ([USERDATA]]);'; +ALL TO ([USERDATA]);'; EXECUTE (@SQL); END; From 47b63543a344d541d3aba65aea147096c530c90e Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 08:37:02 -0700 Subject: [PATCH 25/73] clarified practice for configuring PolyBase --- .../documentation/wwi-olap-sql-features.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-sql-features.md b/samples/databases/wide-world-importers/documentation/wwi-olap-sql-features.md index 77c687d5..99921b6d 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-sql-features.md +++ b/samples/databases/wide-world-importers/documentation/wwi-olap-sql-features.md @@ -8,11 +8,11 @@ WideWorldImportersDW is designed to showcase many of the key features of SQL Ser PolyBase is used to combine sales information from WideWorldImportersDW with a public data set about demographics to understand which cities might be of interest for further expansion of sales. -To enable the use of PolyBase in the sample database, make sure it is installed, and run the following statement in the database: +To enable the use of PolyBase in the sample database, make sure it is installed, and run the following stored procedure in the database: EXEC [Application].[Configuration_ApplyPolybase] -This will create an external table `dbo.CityPopulationStatistics` that references a public data set that contains population data for cities in the United States, hosted in Azure blob storage. The following query returns the data from that external data set: +This will create an external table `dbo.CityPopulationStatistics` that references a public data set that contains population data for cities in the United States, hosted in Azure blob storage. You are encouraged to review the code in the stored procedure to understand the configuration process. If you want to host your own data in Azure blob storage and keep it secure from general public access, you will need to undertake additional configuration steps. The following query returns the data from that external data set: SELECT CityID, StateProvinceCode, CityName, YearNumber, LatestRecordedPopulation FROM dbo.CityPopulationStatistics; From f57501849c7af6a9c64f50e54686830230822dab Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 08:56:06 -0700 Subject: [PATCH 26/73] resolved formatting issue --- .../documentation/wwi-oltp-htap-installation.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md index 8b7d3596..68671f52 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md +++ b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md @@ -23,6 +23,7 @@ Source code to recreate the sample database is available from the following loca ### SQL Server To restore a backup to a SQL Server instance, you can use Management Studio. + 1. Open SQL Server Management Studio and connect to the target SQL Server instance. 2. Right-click on the **Databases** node, and select **Restore Database**. 3. Select **Device** and click on the button **...** @@ -33,6 +34,7 @@ To restore a backup to a SQL Server instance, you can use Management Studio. ### Azure SQL Database To import a bacpac into a new SQL Database, you can use Management Studio. + 1. (optional) If you do not yet have a SQL Server in Azure, navigate to the [Azure portal](https://portal.azure.com/) and create a new SQL Database. In the process of create a database, you will create a server. Make note of the server. - See [this tutorial](https://azure.microsoft.com/documentation/articles/sql-database-get-started/) to create a database in minutes 2. Open SQL Server Management Studio and connect to your server in Azure. From 6a75ad61ffcd90962246bde507077e0dbe828250 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 08:57:02 -0700 Subject: [PATCH 27/73] resolved formatting issue --- .../documentation/wwi-olap-installation.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md b/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md index df413289..62ae3a52 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md +++ b/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md @@ -14,7 +14,7 @@ Download the sample WideWorldImportersDW database backup/bacpac that corresponds Source code to recreate the sample database is available from the following location. Note that data population is based on ETL from the OLTP database (WideWorldImporters): -[wide-world-importers](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers/wwi-dw-database-scripts) +[wide-world-importers-source](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers/wwi-dw-database-scripts) ## Install @@ -22,6 +22,7 @@ Source code to recreate the sample database is available from the following loca ### SQL Server To restore a backup to a SQL Server instance, you can use Management Studio. + 1. Open SQL Server Management Studio and connect to the target SQL Server instance. 2. Right-click on the **Databases** node, and select **Restore Database**. 3. Select **Device** and click on the button **...** @@ -32,6 +33,7 @@ To restore a backup to a SQL Server instance, you can use Management Studio. ### Azure SQL Database To import a bacpac into a new SQL Database, you can use Management Studio. + 1. (optional) If you do not yet have a SQL Server in Azure, navigate to the [Azure portal](https://portal.azure.com/) and create a new SQL Database. In the process of create a database, you will create a server. Make note of the server. - See [this tutorial](https://azure.microsoft.com/documentation/articles/sql-database-get-started/) to create a database in minutes 2. Open SQL Server Management Studio and connect to your server in Azure. From f06135014a6f9442ecdfbd9bc95068df2d4b7be3 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 09:27:48 -0700 Subject: [PATCH 28/73] clarifying note on RLS --- .../documentation/wwi-oltp-htap-sql-features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md index de3a5513..9712d7d8 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md +++ b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md @@ -7,7 +7,7 @@ WideWorldImporters is designed to showcase many of the key features of SQL Serve |Temporal tables|There are many temporal tables, including all look-up style reference tables and main entities such as StockItems, Customers, and Suppliers. Using temporal tables allows to conveniently keep track of the history of these entities.| |AJAX calls for JSON|The application frequently uses AJAX calls to query these tables: Persons, Customers, Suppliers, and StockItems. The calls return JSON payloads (i.e. the data that is returned is formatted as JSON data). See, for example, the stored procedure `Website.SearchForCustomers`.| |JSON property/value bags|A number of tables have columns that hold JSON data to extend the relational data in the table. For example, `Application.SystemParameters` has a column for application settings and `Application.People` has a column to record user preferences. These tables use an `nvarchar(max)` column to record the JSON data, along with a CHECK constraint using the built-in function `ISJSON` to ensure the column values are valid JSON.| -|Row-level security (RLS)|Row Level Security (RLS) is used to limit access to the Customers table, based on role membership. Each sales territory has a role and a user. To see this in action, a script to demonstrate it has been provided.| +|Row-level security (RLS)|Row Level Security (RLS) is used to limit access to the Customers table, based on role membership. Each sales territory has a role and a user. To see this in action, use the corresponding script in sample-script.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).| |Real-time Operational Analytics|(Full version of the database) The core transactional tables `Sales.InvoiceLines` and `Sales.OrderLines` both have a non-clustered columnstore index to support efficient execution of analytical queries in the transactional database with minimal impact on the operational workload. Running transactions and analytics in the same database is also referred to as [Hybrid Transactional/Analytical Processing (HTAP)](https://wikipedia.org/wiki/Hybrid_Transactional/Analytical_Processing_(HTAP)).| |In-Memory OLTP|(Full version of the database) The table types are all memory-optimized, such that table-valued parameters (TVPs) all benefit from memory-optimization.

The two monitoring tables, `Warehouse.VehicleTemperatures` and `Warehouse.ColdRoomTemperatures`, are memory-optimized. This allows the ColdRoomTemperatures table to be populated at higher speed than a traditional disk-based table. The VehicleTemperatures table holds the JSON payload and lends itself to extension towards IoT scenarios. The VehicleTemperatures table further lends itself to scenarios involving EventHubs, Stream Analytics, and Power BI.

The stored procedure `Website.RecordColdRoomTemperatures` is natively compiled to further improve the performance of recording cold room temperatures.| |Clustered columnstore index|(Full version of the database) The table `Warehouse.StockItemTransactions` uses a clustered columnstore index. The number of rows in this table is expected to grow large, and the clustered columnstore index significantly reduces the on-disk size of the table, and improves query performance. The modification on this table are insert-only - there is no update/delete on this table in the online workload - and clustered columnstore index performs well for insert workloads.| From af870c35db64609b342474183e1a98947ff7dabc Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 12:36:32 -0700 Subject: [PATCH 29/73] Update README.md Denzil added to authors --- samples/databases/wide-world-importers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/README.md b/samples/databases/wide-world-importers/README.md index a18f446d..6dea596b 100644 --- a/samples/databases/wide-world-importers/README.md +++ b/samples/databases/wide-world-importers/README.md @@ -28,7 +28,7 @@ The sample includes the databases that can be explored, as well as sample applic 1. **Key features:** Core database features 1. **Workload:** OLTP, OLAP, IoT 1. **Programming Language:** T-SQL, C# -1. **Authors:** Greg Low, Jos de Bruijn +1. **Authors:** Greg Low, Denzil Ribeiro, Jos de Bruijn 1. **Update history:** 25 May 2016 - initial revision From a2be8041fbded4e86dfe1ac1e72105c2196d865d Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 12:37:00 -0700 Subject: [PATCH 30/73] Update README.md adding Denzil --- .../wide-world-importers/wwi-database-scripts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/README.md b/samples/databases/wide-world-importers/wwi-database-scripts/README.md index ba035d79..3eea1d3b 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/README.md +++ b/samples/databases/wide-world-importers/wwi-database-scripts/README.md @@ -20,7 +20,7 @@ The scripts in this folder are used to construct the WideWorldImporters database 1. **Key features:** Core database features 1. **Workload:** OLTP 1. **Programming Language:** T-SQL -1. **Authors:** Greg Low, Jos de Bruijn +1. **Authors:** Greg Low, Denzil Ribeiro, Jos de Bruijn 1. **Update history:** 25 May 2016 - initial revision From bcbeb9feaf7466f9d26a18f47e59d95070b450a3 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 12:37:29 -0700 Subject: [PATCH 31/73] Update README.md adding Denzil --- .../wide-world-importers/wwi-dw-database-scripts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md b/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md index b2a44eac..bb0efe83 100644 --- a/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md +++ b/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md @@ -20,7 +20,7 @@ The scripts in this folder are used to construct the WideWorldImportersDW databa 1. **Key features:** Core database features 1. **Workload:** OLTP 1. **Programming Language:** T-SQL -1. **Authors:** Greg Low, Jos de Bruijn +1. **Authors:** Greg Low, Denzil Ribeiro, Jos de Bruijn 1. **Update history:** 25 May 2016 - initial revision From 38221ca15eb22fd2751d576a4e2956ca4ff549e5 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 12:37:47 -0700 Subject: [PATCH 32/73] Update README.md --- .../wide-world-importers/wwi-integration-etl/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/wwi-integration-etl/README.md b/samples/databases/wide-world-importers/wwi-integration-etl/README.md index dd96f227..1a826236 100644 --- a/samples/databases/wide-world-importers/wwi-integration-etl/README.md +++ b/samples/databases/wide-world-importers/wwi-integration-etl/README.md @@ -21,7 +21,7 @@ This SSIS project performs ETL from the transactional database WideWorldImporter 1. **Key features:** Core database features 1. **Workload:** ETL 1. **Programming Language:** -1. **Authors:** Greg Low, Jos de Bruijn +1. **Authors:** Greg Low, Denzil Ribeiro, Jos de Bruijn 1. **Update history:** 25 May 2016 - initial revision From 6b3b979de3a21cc886072057d454be27b73a3018 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 12:41:22 -0700 Subject: [PATCH 33/73] Update root.md adding email address for feedback --- samples/databases/wide-world-importers/documentation/root.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/samples/databases/wide-world-importers/documentation/root.md b/samples/databases/wide-world-importers/documentation/root.md index 0c2341fb..dfdad25c 100644 --- a/samples/databases/wide-world-importers/documentation/root.md +++ b/samples/databases/wide-world-importers/documentation/root.md @@ -10,6 +10,9 @@ Note that the sample is meant to be representative of a typical database. It doe **Source code for the sample**: [wide-world-importers](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers). +**Feedback**: please send to +[sqlserversamples@microsoft.com](mailto:sqlserversamples@microsoft.com). + The documentation for the sample is organized as follows: ## Overview From d08b782ac67773254d07749ebb9700a3633a2089 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 12:48:50 -0700 Subject: [PATCH 34/73] Update README.md adding feedback email address --- samples/databases/wide-world-importers/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples/databases/wide-world-importers/README.md b/samples/databases/wide-world-importers/README.md index 6dea596b..a29693b2 100644 --- a/samples/databases/wide-world-importers/README.md +++ b/samples/databases/wide-world-importers/README.md @@ -10,6 +10,8 @@ The sample includes the databases that can be explored, as well as sample applic **Documentation**: [root.md](http://go.microsoft.com/fwlink/?LinkID=800631) +**Feedback on the sample**: send to [sqlserversamples@microsoft.com](mailto:sqlserversamples@microsoft.com) + ### Contents [About this sample](#about-this-sample)
From c3ebc6bde24df4230568f93eaafc9544d9147856 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 13:01:20 -0700 Subject: [PATCH 35/73] Update wwi-data-generation.md formatting improvements --- .../documentation/wwi-data-generation.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-data-generation.md b/samples/databases/wide-world-importers/documentation/wwi-data-generation.md index b645075b..1ed9df1b 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-data-generation.md +++ b/samples/databases/wide-world-importers/documentation/wwi-data-generation.md @@ -11,12 +11,14 @@ To generate sample data up to the current date, follow these steps: 1. If you have not yet done so, install a clean version of the WideWorldImporters database. For installation instructions, [WideWorldImporters Installation and Configuration](wwi-oltp-htap-installation.md). 2. Execute the following statement in the database: - EXEC WideWorldImporters.DataLoadSimulation.PopulateDataToCurrentDate +``` + EXEC DataLoadSimulation.PopulateDataToCurrentDate @AverageNumberOfCustomerOrdersPerDay = 60, @SaturdayPercentageOfNormalWorkDay = 50, @SundayPercentageOfNormalWorkDay = 0, @IsSilentMode = 1, @AreDatesPrinted = 1; +``` This statement adds sample sales and purchase data in the database, up to the current date. It outputs the progress of the data generation day-by-day. It will take rougly 10 minutes for every year that needs data. Note that there are some differences in the data generated between runs, since there is a random factor in the data generation. @@ -30,6 +32,8 @@ To import sample data up to the current date in the OLAP database WideWorldImpor 2. If you have not yet done so, install a clean version of the WideWorldImportersDW database. For installation instructions, [WideWorldImporters Installation and Configuration](wwi-olap-installation.md). 3. Reseed the OLAP database by executing the following statement in the database: +``` EXECUTE [Application].Configuration_ReseedETL +``` 4. Run the SSIS package **Daily ETL.ispac** to import the data into the OLAP database. For instructions on how to run the ETL job, see [WideWorldImporters ETL Workflow](wwi-etl.md). From 388e6d2355fbdadf03bbd6c736e325375d054d75 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 13:12:08 -0700 Subject: [PATCH 36/73] Update README.md resolved formatting issue --- .../wide-world-importers/wwi-database-scripts/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/README.md b/samples/databases/wide-world-importers/wwi-database-scripts/README.md index 3eea1d3b..7b82cb38 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/README.md +++ b/samples/databases/wide-world-importers/wwi-database-scripts/README.md @@ -57,8 +57,7 @@ Note that each time the databases are reconstructed from empty, they will contai 5. Execute the script **5-wwi-load-seed-data.sql**. This script populates the seed data required for the database. It will typically take a few minutes to execute. 6. Execute the script **6-wwi-data-simulation.sql**. This script runs data simulation to populate the transaction tables. It can take 20-30 minutes to execute. - -The statements in this script remove the temporal nature of the tables, and implements a series of triggers. They then emulate typical activities that would occur during each day. Finally, they remove the triggers and re-establishes the temporal tables. You can see the progress of the simulation in the Messages tab in SSMS as the query executes. (IsSilentMode = 1 produces just date output if AreDatesPrinted = 1. When 0, it produces much more detailed output about each task being undertaken). +

The statements in this script remove the temporal nature of the tables, and implements a series of triggers. They then emulate typical activities that would occur during each day. Finally, they remove the triggers and re-establishes the temporal tables. You can see the progress of the simulation in the Messages tab in SSMS as the query executes. (IsSilentMode = 1 produces just date output if AreDatesPrinted = 1. When 0, it produces much more detailed output about each task being undertaken). Note that a different outcome is produced each time it is run as it uses many random values. StartDate and EndDate cover the period for generation. Other code populates the 2012 period when expanding the columnstore tables so do not populate back into 2012 or earlier with this procedure. The EndDate must also be at or before the current date as temporal tables do not allow future dates. You can configure the amount of data produced by modifying the number of orders per day. The default is 60 orders and produces a reasonable OLTP database size of around 93MB compressed. You are also able to configure how busy Saturday and Sunday are compared to normal Monday to Friday working days, as a percentage. The suggested values are 50% for Saturday and 0% for Sunday. From d491e52095f8652dc50f1fc82bf63e3e1f332a5d Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 16:59:20 -0700 Subject: [PATCH 37/73] Update wwi-overview.md removing comment about version --- .../wide-world-importers/documentation/wwi-overview.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-overview.md b/samples/databases/wide-world-importers/documentation/wwi-overview.md index 58b75fb5..352b4c8a 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-overview.md +++ b/samples/databases/wide-world-importers/documentation/wwi-overview.md @@ -38,10 +38,6 @@ These are additional workflows. - Cold room temperatures. Perishable goods are stored in refrigerated rooms. Sensor data from these rooms is ingested into the database for monitoring and analytics purposes. - Vehicle location tracking. Vehicles that transport goods for WWI include sensors that track the location. This location is again ingested into the database for monitoring and further analytics. -## Version of the application - -World Wide Importers has migrated from their previous system to this new SQL Server WWI database system starting January 1, 2013. They migrated to the latest version of SQL Server and started leveraging Azure SQL Database in 2016 to benefit from all the new capabilities. - ## Fiscal year The company operates with a financial year that starts on November 1st. From a4244c0acdb0b3a65ab46e4befaf31fbc1ef5369 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 17:05:52 -0700 Subject: [PATCH 38/73] Update wwi-oltp-htap-sql-features.md fixes --- .../documentation/wwi-oltp-htap-sql-features.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md index 9712d7d8..9e4ad1e8 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md +++ b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md @@ -8,11 +8,12 @@ WideWorldImporters is designed to showcase many of the key features of SQL Serve |AJAX calls for JSON|The application frequently uses AJAX calls to query these tables: Persons, Customers, Suppliers, and StockItems. The calls return JSON payloads (i.e. the data that is returned is formatted as JSON data). See, for example, the stored procedure `Website.SearchForCustomers`.| |JSON property/value bags|A number of tables have columns that hold JSON data to extend the relational data in the table. For example, `Application.SystemParameters` has a column for application settings and `Application.People` has a column to record user preferences. These tables use an `nvarchar(max)` column to record the JSON data, along with a CHECK constraint using the built-in function `ISJSON` to ensure the column values are valid JSON.| |Row-level security (RLS)|Row Level Security (RLS) is used to limit access to the Customers table, based on role membership. Each sales territory has a role and a user. To see this in action, use the corresponding script in sample-script.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).| -|Real-time Operational Analytics|(Full version of the database) The core transactional tables `Sales.InvoiceLines` and `Sales.OrderLines` both have a non-clustered columnstore index to support efficient execution of analytical queries in the transactional database with minimal impact on the operational workload. Running transactions and analytics in the same database is also referred to as [Hybrid Transactional/Analytical Processing (HTAP)](https://wikipedia.org/wiki/Hybrid_Transactional/Analytical_Processing_(HTAP)).| -|In-Memory OLTP|(Full version of the database) The table types are all memory-optimized, such that table-valued parameters (TVPs) all benefit from memory-optimization.

The two monitoring tables, `Warehouse.VehicleTemperatures` and `Warehouse.ColdRoomTemperatures`, are memory-optimized. This allows the ColdRoomTemperatures table to be populated at higher speed than a traditional disk-based table. The VehicleTemperatures table holds the JSON payload and lends itself to extension towards IoT scenarios. The VehicleTemperatures table further lends itself to scenarios involving EventHubs, Stream Analytics, and Power BI.

The stored procedure `Website.RecordColdRoomTemperatures` is natively compiled to further improve the performance of recording cold room temperatures.| +|Real-time Operational Analytics|(Full version of the database) The core transactional tables `Sales.InvoiceLines` and `Sales.OrderLines` both have a non-clustered columnstore index to support efficient execution of analytical queries in the transactional database with minimal impact on the operational workload. Running transactions and analytics in the same database is also referred to as [Hybrid Transactional/Analytical Processing (HTAP)](https://wikipedia.org/wiki/Hybrid_Transactional/Analytical_Processing_(HTAP)). To see this in action, use the corresponding script in sample-script.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).| +|PolyBase|To see this PolyBase in action, using an external table with a public data set hosted in Azure blog storage, use the corresponding script in sample-script.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).| +|In-Memory OLTP|(Full version of the database) The table types are all memory-optimized, such that table-valued parameters (TVPs) all benefit from memory-optimization.

The two monitoring tables, `Warehouse.VehicleTemperatures` and `Warehouse.ColdRoomTemperatures`, are memory-optimized. This allows the ColdRoomTemperatures table to be populated at higher speed than a traditional disk-based table. The VehicleTemperatures table holds the JSON payload and lends itself to extension towards IoT scenarios. The VehicleTemperatures table further lends itself to scenarios involving EventHubs, Stream Analytics, and Power BI.

The stored procedure `Website.RecordColdRoomTemperatures` is natively compiled to further improve the performance of recording cold room temperatures.

To see an example of In-Memory OLTP in action, see the vehicle-locations workload driver in workload-drivers.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).| |Clustered columnstore index|(Full version of the database) The table `Warehouse.StockItemTransactions` uses a clustered columnstore index. The number of rows in this table is expected to grow large, and the clustered columnstore index significantly reduces the on-disk size of the table, and improves query performance. The modification on this table are insert-only - there is no update/delete on this table in the online workload - and clustered columnstore index performs well for insert workloads.| |Dynamic Data Masking|In the database schema, Data Masking has been applied to the bank details held for Suppliers, in the table `Purchasing.Suppliers`. Non-admin staff will not have access to this information.| -|Always Encrypted|The AccountNumber field uses AlwaysEncrypted. Unfortunately, at present, it cannot also use data masking.

A demo for Always Encrypted is included in the downloadable samples.zip. The demo creates an encryption key, a table using encryption for sensitive data, and a small sample application that inserts data into the table.| +|Always Encrypted|A demo for Always Encrypted is included in the downloadable samples.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).. The demo creates an encryption key, a table using encryption for sensitive data, and a small sample application that inserts data into the table.| |Stretch database|The `Warehouse.ColdRoomTemperatures` table has been implemented as a temporal table, and is memory-optimized in the Full version of the sample database. The archive table is disk-based and can be stretched to Azure.| |Full-text indexes|Full-text indexes improve searches for People, Customers, and StockItems. The indexes are applied to queries only if you have full-text indexing installed on your SQL Server instance. A non-persistent computed column is used to create the data that is full-text indexed in the StockItems table.

`CONCAT` is used for concatenating the fields to create SearchData that is full-text indexed.
To enable the use of full-text indexes in the sample execute the following statement in the database:

`EXECUTE [Application].[Configuration_ConfigureFullTextIndexing]`

The procedure creates a default fulltext catalog if one doesn’t already exist, then replaces the search views with full-text versions of those views).

Note that using full-text indexes in SQL Server requires selecting the Full-Text option during installation. Azure SQL Database does not require and specific configuration to enable full-text indexes.| |Indexed persisted computed columns|Indexed persisted computed columns used in SupplierTransactions and CustomerTransactions.| From 397cb7811e8b292dd34b370b6d2e2af1aef3ec8e Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 17:06:54 -0700 Subject: [PATCH 39/73] Update wwi-olap-installation.md note about edition for polybase --- .../wide-world-importers/documentation/wwi-olap-installation.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md b/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md index 62ae3a52..fcfa2c90 100644 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md +++ b/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md @@ -44,6 +44,8 @@ To import a bacpac into a new SQL Database, you can use Management Studio. ## Configuration +[Applies to SQL Server 2016 (and later) Developer/Evaluation/Enterprise Edition] + The sample database can make use of PolyBase to query files in Hadoop or Azure blob storage. However, that feature is not installed by default with SQL Server - you need to select it during SQL Server setup. Therefore, a post-installation step is required. 1. In SQL Server Management Studio, connect to the WideWorldImportersDW database and open a new query window. From 168031e27b12a141b5a150520480f2e6f88d1fda Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 17:10:12 -0700 Subject: [PATCH 40/73] Update README.md --- .../wide-world-importers/wwi-database-scripts/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/README.md b/samples/databases/wide-world-importers/wwi-database-scripts/README.md index 7b82cb38..c70bf3ca 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/README.md +++ b/samples/databases/wide-world-importers/wwi-database-scripts/README.md @@ -1,6 +1,8 @@ # Construct WideWorldImporters OLTP Database -The scripts in this folder are used to construct the WideWorldImporters database from scratch on SQL Server or Azure SQL Database. +The scripts in this folder are used to construct the WideWorldImporters database from scratch on SQL Server or Azure SQL Database. It is possible to vary the data size (see step 6 in the instructions below). + +A pre-created version of the database is available for download as part of the latest release of the sample: [wide-world-importers-release](http://go.microsoft.com/fwlink/?LinkID=800630). ### Contents @@ -33,7 +35,7 @@ To run this sample, you need the following prerequisites. 1. SQL Server 2016 (or higher) or an Azure SQL Database. -2. SQL Server Management Studio, preferably 2016 April Preview or later (version >= 13.0.14000.36) +2. SQL Server Management Studio, 2016 June release or later (version >= 13.0.15000.23) From b683034bf6fe6dd9e6bd1b70632484dfe7e4a5bf Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Fri, 3 Jun 2016 17:10:39 -0700 Subject: [PATCH 41/73] Update README.md --- .../wide-world-importers/wwi-dw-database-scripts/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md b/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md index bb0efe83..f4022656 100644 --- a/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md +++ b/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md @@ -2,6 +2,8 @@ The scripts in this folder are used to construct the WideWorldImportersDW database from scratch on SQL Server or Azure SQL Database. +A pre-created version of the database is available for download as part of the latest release of the sample: [wide-world-importers-release](http://go.microsoft.com/fwlink/?LinkID=800630). + ### Contents [About this sample](#about-this-sample)
From 470ce0f57cecfb0b68e981b5324b599ac4d3607d Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Mon, 6 Jun 2016 11:12:37 -0700 Subject: [PATCH 42/73] fixes to follow best practices --- .gitignore | 10 ++- .../1-wwi-metadata-population.sql | 76 ++++++++++--------- .../wwi-database-scripts/3-wwi-recreate.sql | 6 ++ ...wi-configure-required-database-objects.sql | 1 + 4 files changed, 57 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index 254d5795..89eec100 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,12 @@ samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateA samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe *.Cache samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.exe.config -samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs \ No newline at end of file +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +*.exe +samples/features/in-memory/iot-smart-grid/ConsoleClient/bin/Release/DataGenerator.dll +samples/features/in-memory/iot-smart-grid/ConsoleClient/bin/Release/Reports/PowerDashboard.pbix +samples/databases/wide-world-importers/wwi-integration-etl/Daily ETL/bin/Development/Daily ETL.ispac +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Release/PopulateAlwaysEncryptedData.vshost.exe.config +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs \ No newline at end of file diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/1-wwi-metadata-population.sql b/samples/databases/wide-world-importers/wwi-database-scripts/1-wwi-metadata-population.sql index b8528d93..7bab52e7 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/1-wwi-metadata-population.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/1-wwi-metadata-population.sql @@ -1,7 +1,7 @@ -- WideWorldImporters Database Metadata Population -- -- Creates the WWI_Prep Database --- +-- USE master; GO @@ -76,7 +76,7 @@ CREATE TABLE Metadata.[Constraints] [ConstraintID] int IDENTITY(1,1) CONSTRAINT PK_Metadata_Constraints PRIMARY KEY, TableName sysname NOT NULL, - ConstraintName sysname NOT NULL, + ConstraintName sysname NOT NULL, ConstraintDefinition nvarchar(max) NOT NULL, ConstraintDescription nvarchar(max) NOT NULL ); @@ -87,7 +87,7 @@ CREATE TABLE Metadata.[Indexes] [IndexID] int IDENTITY(1,1) CONSTRAINT PK_Metadata_Indexes PRIMARY KEY, TableName sysname NOT NULL, - IndexName sysname NOT NULL, + IndexName sysname NOT NULL, IndexColumns nvarchar(max) NOT NULL, IncludedColumns nvarchar(max) NULL, IsUnique bit NOT NULL, @@ -97,9 +97,9 @@ CREATE TABLE Metadata.[Indexes] GO -- Schemas -INSERT Metadata.[Schemas] +INSERT Metadata.[Schemas] (SchemaName, SchemaDescription) -VALUES +VALUES (N'Application', N'Tables common across the application. Used for categorization and lookup lists, system parameters and people (users and contacts)'), (N'DataLoadSimulation', N'Tables and procedures used only during simulated data loading operations'), (N'Integration', 'Tables and procedures required for integration with the data warehouse'), @@ -184,7 +184,7 @@ VALUES (N'PaymentMethods', N'PaymentMethodName', 0, N'nvarchar', 0, 50, NULL, NULL, 0, 0, NULL, NULL, 1, 0, NULL, NULL, 0, NULL, N'Full name of ways that customers can make payments or that suppliers can be paid'); GO --- Application.People Table +-- Application.People Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (10, N'Application', N'People', 1, 1, N'People known to the application (staff, customer contacts, supplier contacts)'); @@ -217,25 +217,25 @@ GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'People', N'IX_Application_People_IsEmployee', N'[IsEmployee]', NULL, 0, NULL, N'Allows quickly locating employees'); GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'People', N'IX_Application_People_IsSalesperson', N'[IsSalesperson]', NULL, 0, NULL, N'Allows quickly locating salespeople'); GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'People', N'IX_Application_People_FullName', N'[FullName]', NULL, 0, NULL, N'Improves performance of name-related queries'); GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'People', N'IX_Application_People_Perf_20160301_05', N'[IsPermittedToLogon],[PersonID]', N'[FullName], [EmailAddress]', 0, NULL, N'Improves performance of order picking and invoicing'); GO @@ -261,11 +261,11 @@ GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'StateProvinces', N'IX_Application_StateProvinces_SalesTerritory', N'[SalesTerritory]', NULL, 0, NULL, N'Index used to quickly locate sales territories'); GO --- Application.SystemParameters Table +-- Application.SystemParameters Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (190, N'Application', N'SystemParameters', 0, 1, N'Any configurable parameters for the whole system'); @@ -304,7 +304,7 @@ VALUES (N'TransactionTypes', N'TransactionTypeName', 0, N'nvarchar', 0, 50, NULL, NULL, 0, 0, NULL, NULL, 1, 0, NULL, NULL, 0, NULL, N'Full name of the transaction type'); GO --- Purchasing.PurchaseOrderLines Table +-- Purchasing.PurchaseOrderLines Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (250, N'Purchasing', N'PurchaseOrderLines', 0, 1, N'Detail lines from supplier purchase orders'); @@ -329,11 +329,11 @@ GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'PurchaseOrderLines', N'IX_Purchasing_PurchaseOrderLines_Perf_20160301_4', N'[IsOrderLineFinalized], [StockItemID]', N'[OrderedOuters], [ReceivedOuters]', 0, NULL, N'Improves performance of order picking and invoicing'); GO --- Purchasing.PurchaseOrders Table +-- Purchasing.PurchaseOrders Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (220, N'Purchasing', N'PurchaseOrders', 0, 1, N'Details of supplier purchase orders'); @@ -371,7 +371,7 @@ VALUES (N'SupplierCategories', N'SupplierCategoryName', 0, N'nvarchar', 0, 50, NULL, NULL, 0, 0, NULL, NULL, 1, 0, NULL, NULL, 0, NULL, N'Full name of the category that suppliers can be assigned to'); GO --- Purchasing.Suppliers Table +-- Purchasing.Suppliers Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (200, N'Purchasing', N'Suppliers', 1, 1, N'Main entity table for suppliers (organizations)'); @@ -410,7 +410,7 @@ VALUES (N'Suppliers', N'PostalPostalCode', 0, N'nvarchar', 0, 10, NULL, NULL, 0, 0, NULL, NULL, 0, 0, NULL, NULL, 0, NULL, N'Postal code for the supplier when sending by mail'); GO --- Purchasing.SupplierTransactions Table +-- Purchasing.SupplierTransactions Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (260, N'Purchasing', N'SupplierTransactions', 0, 1, N'All financial transactions that are supplier-related'); @@ -438,7 +438,7 @@ GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'SupplierTransactions', N'IX_Purchasing_SupplierTransactions_IsFinalized', N'[IsFinalized]', NULL, 0, NULL, N'Index used to quickly locate unfinalized transactions'); GO @@ -472,7 +472,7 @@ VALUES (N'CustomerCategories', N'CustomerCategoryName', 0, N'nvarchar', 0, 50, NULL, NULL, 0, 0, NULL, NULL, 1, 0, NULL, NULL, 0, NULL, N'Full name of the category that customers can be assigned to'); GO --- Sales.Customers Table +-- Sales.Customers Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (210, N'Sales', N'Customers', 1, 1, N'Main entity tables for customers (organizations or individuals)'); @@ -515,7 +515,7 @@ GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'Customers', N'IX_Sales_Customers_Perf_20160301_06', N'[IsOnCreditHold], [CustomerID], [BillToCustomerID]', N'[PrimaryContactPersonID]', 0, NULL, N'Improves performance of order picking and invoicing'); GO @@ -557,7 +557,7 @@ VALUES (N'SpecialDeals', N'CK_Sales_SpecialDeals_Unit_Price_Deal_Requires_Specia N'Ensures that if a specific price is allocated that it applies to a specific stock item'); GO --- Sales.CustomerTransactions Table +-- Sales.CustomerTransactions Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (360, N'Sales', N'CustomerTransactions', 0, 1, N'All financial transactions that are customer-related'); @@ -584,11 +584,11 @@ GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'CustomerTransactions', N'IX_Sales_CustomerTransactions_IsFinalized', N'[IsFinalized]', NULL, 0, NULL, N'Allows quick location of unfinalized transactions'); GO --- Sales.InvoiceLines Table +-- Sales.InvoiceLines Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (370, N'Sales', N'InvoiceLines', 0, 1, N'Detail lines from customer invoices'); @@ -612,7 +612,7 @@ VALUES (N'InvoiceLines', N'ExtendedPrice', 0, N'decimal', 0, NULL, 18, 2, 0, 0, NULL, NULL, 0, 0, NULL, NULL, 0, NULL, N'Extended line price charged'); GO --- Sales.Invoices Table +-- Sales.Invoices Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (310, N'Sales', N'Invoices', 0, 1, N'Details of customer invoices'); @@ -650,7 +650,7 @@ GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'Invoices', N'IX_Sales_Invoices_ConfirmedDeliveryTime', N'[ConfirmedDeliveryTime]', N'[ConfirmedReceivedBy]', 0, NULL, N'Allows quick retrieval of invoices confirmed to have been delivered in a given time period'); GO @@ -660,7 +660,7 @@ VALUES (N'Invoices', N'CK_Sales_Invoices_ReturnedDeliveryData_Must_Be_Valid_JSON N'CHECK (ReturnedDeliveryData IS NULL OR ISJSON(ReturnedDeliveryData) <> 0)', N'Ensures that if returned delivery data is present that it is valid JSON'); --- Sales.OrderLines Table +-- Sales.OrderLines Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (320, N'Sales', N'OrderLines', 0, 1, N'Detail lines from customer orders'); @@ -685,23 +685,23 @@ GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'OrderLines', N'IX_Sales_OrderLines_AllocatedStockItems', N'[StockItemID]', N'[PickedQuantity]', 0, NULL, N'Allows quick summation of stock item quantites already allocated to uninvoiced orders'); GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'OrderLines', N'IX_Sales_OrderLines_Perf_20160301_01', N'[PickingCompletedWhen], [OrderID], [OrderLineID]', N'[Quantity], [StockItemID]', 0, NULL, N'Improves performance of order picking and invoicing'); GO INSERT Metadata.[Indexes] (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) -VALUES +VALUES (N'OrderLines', N'IX_Sales_OrderLines_Perf_20160301_02', N'[StockItemID], [PickingCompletedWhen]', N'[OrderID], [PickedQuantity]', 0, NULL, N'Improves performance of order picking and invoicing'); GO --- Sales.Orders Table +-- Sales.Orders Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (230, N'Sales', N'Orders', 0, 1, N'Detail of customer orders'); @@ -745,6 +745,12 @@ VALUES (N'ColdRoomTemperatures', N'Temperature', 0, N'decimal', 0, NULL, 10, 2, 0, 0, NULL, NULL, 0, 0, NULL, NULL, 0, NULL, N'Temperature at the time of recording'); GO +INSERT Metadata.[Indexes] + (TableName, IndexName, IndexColumns, IncludedColumns, IsUnique, FilterClause, IndexDescription) +VALUES + (N'ColdRoomTemperatures', N'IX_Warehouse_ColdRoomTemperatures_ColdRoomSensorNumber', N'[ColdRoomSensorNumber]', NULL, 0, NULL, N'Allows quickly locating sensors'); +GO + -- Warehouse.Colors Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) @@ -790,7 +796,7 @@ VALUES (N'StockGroups', N'StockGroupName', 0, N'nvarchar', 0, 50, NULL, NULL, 0, 0, NULL, NULL, 1, 0, NULL, NULL, 0, NULL, N'Full name of groups used to categorize stock items'); GO --- Warehouse.StockItemHoldings Table +-- Warehouse.StockItemHoldings Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (245, N'Warehouse', N'StockItemHoldings', 0, 1, N'Non-temporal attributes for stock items'); @@ -810,7 +816,7 @@ VALUES (N'StockItemHoldings', N'TargetStockLevel', 0, N'int', 0, NULL, NULL, NULL, 0, 0, NULL, NULL, 0, 0, NULL, NULL, 0, NULL, N'Typical quantity ordered'); GO --- Warehouse.StockItems Table +-- Warehouse.StockItems Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (240, N'Warehouse', N'StockItems', 1, 1, N'Main entity table for stock items'); @@ -845,7 +851,7 @@ VALUES (N'StockItems', N'SearchDetails', 0, N'AS CONCAT([StockItemName], N'' '', [MarketingComments])', 1, NULL, NULL, NULL, 0, 0, NULL, NULL, 0, 0, NULL, NULL, 0, NULL, N'Combination of columns used by full text search'); GO --- Warehouse.StockItemStockGroups Table +-- Warehouse.StockItemStockGroups Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (350, N'Warehouse', N'StockItemStockGroups', 0, 1, N'Which stock items are in which stock groups'); @@ -868,7 +874,7 @@ VALUES (N'StockItemStockGroups', N'UQ_StockItemStockGroups_StockGroupID_Lookup', N'UNIQUE(StockGroupID, StockItemID)', N'Enforces uniqueness and indexes one side of the many to many relationship'); GO --- Warehouse.StockItemTransactions Table +-- Warehouse.StockItemTransactions Table INSERT Metadata.[Tables] (TableCreationOrder, SchemaName, TableName, IncludeTemporalColumns, IncludeModificationTrackingColumns, TableDescription) VALUES (380, N'Warehouse', N'StockItemTransactions', 0, 1, N'Transactions covering all movements of all stock items'); @@ -927,7 +933,7 @@ AS BEGIN DECLARE @StringToExecute nvarchar(max) = N''; DECLARE @NextLineEnd int; DECLARE @Counter int; - + WHILE LEN(@StringToPrint) > 0 BEGIN SET @NextLineEnd = CHARINDEX(NCHAR(13), @StringToPrint, 1); diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql b/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql index 4ebebd2b..4429f881 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql @@ -242,6 +242,12 @@ WITH ALTER INDEX ix_ColdRoomTemperatures_Archive ON [Warehouse].[ColdRoomTemperatures_Archive] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE); GO +CREATE INDEX [IX_Warehouse_ColdRoomTemperatures_ColdRoomSensorNumber] +ON [Warehouse].[ColdRoomTemperatures]([ColdRoomSensorNumber]); +GO + +EXEC sys.sp_addextendedproperty @name = N'Description', @value = 'Allows quickly locating sensors', @level0type = N'SCHEMA', @level0name = 'Warehouse', @level1type = N'TABLE', @level1name = 'ColdRoomTemperatures', @level2type = N'INDEX', @level2name = 'IX_Warehouse_ColdRoomTemperatures_ColdRoomSensorNumber'; + EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Regularly recorded temperatures of cold room chillers', @level0type = N'SCHEMA', @level0name = 'Warehouse', @level1type = N'TABLE', @level1name = 'ColdRoomTemperatures'; EXEC sys.sp_addextendedproperty @name = N'Description', @value = 'Instantaneous temperature readings for cold rooms (chillers)', @level0type = N'SCHEMA', @level0name = 'Warehouse', @level1type = N'TABLE', @level1name = 'ColdRoomTemperatures', @level2type = N'COLUMN', @level2name = 'ColdRoomTemperatureID'; diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql index 4f90945a..0d5917c1 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql @@ -3964,6 +3964,7 @@ CREATE TABLE Warehouse.ColdRoomTemperatures Temperature decimal(10, 2) NOT NULL, ValidFrom datetime2(7) NOT NULL, ValidTo datetime2(7) NOT NULL, + INDEX [IX_Warehouse_ColdRoomTemperatures_ColdRoomSensorNumber] NONCLUSTERED (ColdRoomSensorNumber), CONSTRAINT PK_Warehouse_ColdRoomTemperatures PRIMARY KEY NONCLUSTERED (ColdRoomTemperatureID) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_AND_DATA);'; EXECUTE (@SQL); From fa57ef7701796927c5a0f77d3316de5f7909566c Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Mon, 6 Jun 2016 12:33:59 -0700 Subject: [PATCH 43/73] fixes to account for best practices --- .gitignore | 6 +- ...dw-configure-required-database-objects.sql | 146 ++++++++++-------- 2 files changed, 83 insertions(+), 69 deletions(-) diff --git a/.gitignore b/.gitignore index 89eec100..fd26bf11 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,8 @@ samples/features/in-memory/iot-smart-grid/ConsoleClient/bin/Release/Reports/Powe samples/databases/wide-world-importers/wwi-integration-etl/Daily ETL/bin/Development/Daily ETL.ispac samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Release/PopulateAlwaysEncryptedData.vshost.exe.config -samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs \ No newline at end of file +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +*.dll +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Release/DemoWorkload.FrmConfig.resources +samples/features/in-memory/ticket-reservations/DemoWorkload/bin/Release/DemoWorkload.vshost.exe.config +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt \ No newline at end of file diff --git a/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql index d117d669..a4f641c3 100644 --- a/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql @@ -574,8 +574,6 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] @@ -591,22 +589,26 @@ BEGIN FROM Dimension.[Stock Item] AS si WHERE si.[WWI Stock Item ID] = m.[WWI Stock Item ID] AND m.[Last Modifed When] > si.[Valid From] - AND m.[Last Modifed When] <= si.[Valid To]), 0), + AND m.[Last Modifed When] <= si.[Valid To] + ORDER BY si.[Valid From]), 0), m.[Customer Key] = COALESCE((SELECT TOP(1) c.[Customer Key] FROM Dimension.Customer AS c WHERE c.[WWI Customer ID] = m.[WWI Customer ID] AND m.[Last Modifed When] > c.[Valid From] - AND m.[Last Modifed When] <= c.[Valid To]), 0), + AND m.[Last Modifed When] <= c.[Valid To] + ORDER BY c.[Valid From]), 0), m.[Supplier Key] = COALESCE((SELECT TOP(1) s.[Supplier Key] FROM Dimension.Supplier AS s WHERE s.[WWI Supplier ID] = m.[WWI Supplier ID] AND m.[Last Modifed When] > s.[Valid From] - AND m.[Last Modifed When] <= s.[Valid To]), 0), + AND m.[Last Modifed When] <= s.[Valid To] + ORDER BY s.[Valid From]), 0), m.[Transaction Type Key] = COALESCE((SELECT TOP(1) tt.[Transaction Type Key] FROM Dimension.[Transaction Type] AS tt WHERE tt.[WWI Transaction Type ID] = m.[WWI Transaction Type ID] AND m.[Last Modifed When] > tt.[Valid From] - AND m.[Last Modifed When] <= tt.[Valid To]), 0) + AND m.[Last Modifed When] <= tt.[Valid To] + ORDER BY tt.[Valid From]), 0) FROM Integration.Movement_Staging AS m; -- Merge the data into the fact table @@ -658,8 +660,6 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] @@ -675,27 +675,32 @@ BEGIN FROM Dimension.City AS c WHERE c.[WWI City ID] = o.[WWI City ID] AND o.[Last Modified When] > c.[Valid From] - AND o.[Last Modified When] <= c.[Valid To]), 0), + AND o.[Last Modified When] <= c.[Valid To] + ORDER BY c.[Valid From]), 0), o.[Customer Key] = COALESCE((SELECT TOP(1) c.[Customer Key] FROM Dimension.Customer AS c WHERE c.[WWI Customer ID] = o.[WWI Customer ID] AND o.[Last Modified When] > c.[Valid From] - AND o.[Last Modified When] <= c.[Valid To]), 0), + AND o.[Last Modified When] <= c.[Valid To] + ORDER BY c.[Valid From]), 0), o.[Stock Item Key] = COALESCE((SELECT TOP(1) si.[Stock Item Key] FROM Dimension.[Stock Item] AS si WHERE si.[WWI Stock Item ID] = o.[WWI Stock Item ID] AND o.[Last Modified When] > si.[Valid From] - AND o.[Last Modified When] <= si.[Valid To]), 0), + AND o.[Last Modified When] <= si.[Valid To] + ORDER BY si.[Valid From]), 0), o.[Salesperson Key] = COALESCE((SELECT TOP(1) e.[Employee Key] FROM Dimension.Employee AS e WHERE e.[WWI Employee ID] = o.[WWI Salesperson ID] AND o.[Last Modified When] > e.[Valid From] - AND o.[Last Modified When] <= e.[Valid To]), 0), + AND o.[Last Modified When] <= e.[Valid To] + ORDER BY e.[Valid From]), 0), o.[Picker Key] = COALESCE((SELECT TOP(1) e.[Employee Key] FROM Dimension.Employee AS e WHERE e.[WWI Employee ID] = o.[WWI Picker ID] AND o.[Last Modified When] > e.[Valid From] - AND o.[Last Modified When] <= e.[Valid To]), 0) + AND o.[Last Modified When] <= e.[Valid To] + ORDER BY e.[Valid From]), 0) FROM Integration.Order_Staging AS o; -- Remove any existing entries for any of these orders @@ -745,8 +750,6 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] @@ -762,12 +765,14 @@ BEGIN FROM Dimension.Supplier AS s WHERE s.[WWI Supplier ID] = p.[WWI Supplier ID] AND p.[Last Modified When] > s.[Valid From] - AND p.[Last Modified When] <= s.[Valid To]), 0), + AND p.[Last Modified When] <= s.[Valid To] + ORDER BY s.[Valid From]), 0), p.[Stock Item Key] = COALESCE((SELECT TOP(1) si.[Stock Item Key] FROM Dimension.[Stock Item] AS si WHERE si.[WWI Stock Item ID] = p.[WWI Stock Item ID] AND p.[Last Modified When] > si.[Valid From] - AND p.[Last Modified When] <= si.[Valid To]), 0) + AND p.[Last Modified When] <= si.[Valid To] + ORDER BY si.[Valid From]), 0) FROM Integration.Purchase_Staging AS p; -- Remove any existing entries for any of these purchase orders @@ -813,8 +818,6 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] @@ -830,27 +833,32 @@ BEGIN FROM Dimension.City AS c WHERE c.[WWI City ID] = s.[WWI City ID] AND s.[Last Modified When] > c.[Valid From] - AND s.[Last Modified When] <= c.[Valid To]), 0), + AND s.[Last Modified When] <= c.[Valid To] + ORDER BY c.[Valid From]), 0), s.[Customer Key] = COALESCE((SELECT TOP(1) c.[Customer Key] FROM Dimension.Customer AS c WHERE c.[WWI Customer ID] = s.[WWI Customer ID] AND s.[Last Modified When] > c.[Valid From] - AND s.[Last Modified When] <= c.[Valid To]), 0), + AND s.[Last Modified When] <= c.[Valid To] + ORDER BY c.[Valid From]), 0), s.[Bill To Customer Key] = COALESCE((SELECT TOP(1) c.[Customer Key] FROM Dimension.Customer AS c WHERE c.[WWI Customer ID] = s.[WWI Bill To Customer ID] AND s.[Last Modified When] > c.[Valid From] - AND s.[Last Modified When] <= c.[Valid To]), 0), + AND s.[Last Modified When] <= c.[Valid To] + ORDER BY c.[Valid From]), 0), s.[Stock Item Key] = COALESCE((SELECT TOP(1) si.[Stock Item Key] FROM Dimension.[Stock Item] AS si WHERE si.[WWI Stock Item ID] = s.[WWI Stock Item ID] AND s.[Last Modified When] > si.[Valid From] - AND s.[Last Modified When] <= si.[Valid To]), 0), + AND s.[Last Modified When] <= si.[Valid To] + ORDER BY si.[Valid From]), 0), s.[Salesperson Key] = COALESCE((SELECT TOP(1) e.[Employee Key] FROM Dimension.Employee AS e WHERE e.[WWI Employee ID] = s.[WWI Salesperson ID] AND s.[Last Modified When] > e.[Valid From] - AND s.[Last Modified When] <= e.[Valid To]), 0) + AND s.[Last Modified When] <= e.[Valid To] + ORDER BY e.[Valid From]), 0) FROM Integration.Sale_Staging AS s; -- Remove any existing entries for any of these invoices @@ -956,8 +964,6 @@ BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999'; - BEGIN TRAN; DECLARE @LineageKey int = (SELECT TOP(1) [Lineage Key] @@ -973,27 +979,32 @@ BEGIN FROM Dimension.Customer AS c WHERE c.[WWI Customer ID] = t.[WWI Customer ID] AND t.[Last Modified When] > c.[Valid From] - AND t.[Last Modified When] <= c.[Valid To]), 0), + AND t.[Last Modified When] <= c.[Valid To] + ORDER BY c.[Valid From]), 0), t.[Bill To Customer Key] = COALESCE((SELECT TOP(1) c.[Customer Key] FROM Dimension.Customer AS c WHERE c.[WWI Customer ID] = t.[WWI Bill To Customer ID] AND t.[Last Modified When] > c.[Valid From] - AND t.[Last Modified When] <= c.[Valid To]), 0), + AND t.[Last Modified When] <= c.[Valid To] + ORDER BY c.[Valid From]), 0), t.[Supplier Key] = COALESCE((SELECT TOP(1) s.[Supplier Key] FROM Dimension.Supplier AS s WHERE s.[WWI Supplier ID] = t.[WWI Supplier ID] AND t.[Last Modified When] > s.[Valid From] - AND t.[Last Modified When] <= s.[Valid To]), 0), + AND t.[Last Modified When] <= s.[Valid To] + ORDER BY s.[Valid From]), 0), t.[Transaction Type Key] = COALESCE((SELECT TOP(1) tt.[Transaction Type Key] FROM Dimension.[Transaction Type] AS tt WHERE tt.[WWI Transaction Type ID] = t.[WWI Transaction Type ID] AND t.[Last Modified When] > tt.[Valid From] - AND t.[Last Modified When] <= tt.[Valid To]), 0), + AND t.[Last Modified When] <= tt.[Valid To] + ORDER BY tt.[Valid From]), 0), t.[Payment Method Key] = COALESCE((SELECT TOP(1) pm.[Payment Method Key] FROM Dimension.[Payment Method] AS pm WHERE pm.[WWI Payment Method ID] = t.[WWI Payment Method ID] AND t.[Last Modified When] > pm.[Valid From] - AND t.[Last Modified When] <= pm.[Valid To]), 0) + AND t.[Last Modified When] <= pm.[Valid To] + ORDER BY pm.[Valid From]), 0) FROM Integration.Transaction_Staging AS t; -- Insert all the transactions @@ -1165,8 +1176,7 @@ DROP TABLE IF EXISTS Integration.Customer_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[Customer_Staging] ( - [Customer Staging Key] [int] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Customer Staging Key] [int] IDENTITY(1,1) NOT NULL, [WWI Customer ID] [int] NOT NULL, [Customer] [nvarchar](100) NOT NULL, [Bill To Customer] [nvarchar](100) NOT NULL, @@ -1175,7 +1185,8 @@ CREATE TABLE [Integration].[Customer_Staging] [Primary Contact] [nvarchar](50) NOT NULL, [Postal Code] [nvarchar](10) NOT NULL, [Valid From] [datetime2](7) NOT NULL, - [Valid To] [datetime2](7) NOT NULL + [Valid To] [datetime2](7) NOT NULL, + CONSTRAINT PK_Integration_Customer_Staging PRIMARY KEY NONCLUSTERED ([Customer Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1190,15 +1201,15 @@ DROP TABLE IF EXISTS Integration.Employee_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[Employee_Staging] ( - [Employee Staging Key] [int] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Employee Staging Key] [int] IDENTITY(1,1) NOT NULL, [WWI Employee ID] [int] NOT NULL, [Employee] [nvarchar](50) NOT NULL, [Preferred Name] [nvarchar](50) NOT NULL, [Is Salesperson] [bit] NOT NULL, [Photo] [varbinary](max) NULL, [Valid From] [datetime2](7) NOT NULL, - [Valid To] [datetime2](7) NOT NULL + [Valid To] [datetime2](7) NOT NULL, + CONSTRAINT PK_Integration_Employee_Staging PRIMARY KEY NONCLUSTERED ([Employee Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1213,8 +1224,7 @@ DROP TABLE IF EXISTS Integration.Movement_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[Movement_Staging] ( - [Movement Staging Key] [bigint] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Movement Staging Key] [bigint] IDENTITY(1,1) NOT NULL, [Date Key] [date] NULL, [Stock Item Key] [int] NULL, [Customer Key] [int] NULL, @@ -1228,7 +1238,8 @@ CREATE TABLE [Integration].[Movement_Staging] [WWI Customer ID] [int] NULL, [WWI Supplier ID] [int] NULL, [WWI Transaction Type ID] [int] NULL, - [Last Modifed When] [datetime2](7) NULL + [Last Modifed When] [datetime2](7) NULL, + CONSTRAINT PK_Integration_Movement_Staging PRIMARY KEY NONCLUSTERED ([Movement Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1242,8 +1253,7 @@ DROP TABLE IF EXISTS Integration.Order_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[Order_Staging]( - [Order Staging Key] [bigint] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Order Staging Key] [bigint] IDENTITY(1,1) NOT NULL, [City Key] [int] NULL, [Customer Key] [int] NULL, [Stock Item Key] [int] NULL, @@ -1267,7 +1277,8 @@ CREATE TABLE [Integration].[Order_Staging]( [WWI Stock Item ID] [int] NULL, [WWI Salesperson ID] [int] NULL, [WWI Picker ID] [int] NULL, - [Last Modified When] [datetime2](7) NULL + [Last Modified When] [datetime2](7) NULL, + CONSTRAINT PK_Integration_Order_Staging PRIMARY KEY NONCLUSTERED ([Order Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1282,12 +1293,12 @@ DROP TABLE IF EXISTS Integration.PaymentMethod_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[PaymentMethod_Staging] ( - [Payment Method Staging Key] [int] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Payment Method Staging Key] [int] IDENTITY(1,1) NOT NULL, [WWI Payment Method ID] [int] NOT NULL, [Payment Method] [nvarchar](50) NOT NULL, [Valid From] [datetime2](7) NOT NULL, - [Valid To] [datetime2](7) NOT NULL + [Valid To] [datetime2](7) NOT NULL, + CONSTRAINT PK_Integration_Payment_Method_Staging PRIMARY KEY NONCLUSTERED ([Payment Method Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1302,8 +1313,7 @@ DROP TABLE IF EXISTS Integration.Purchase_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[Purchase_Staging] ( - [Purchase Staging Key] [bigint] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Purchase Staging Key] [bigint] IDENTITY(1,1) NOT NULL, [Date Key] [date] NULL, [Supplier Key] [int] NULL, [Stock Item Key] [int] NULL, @@ -1315,7 +1325,8 @@ CREATE TABLE [Integration].[Purchase_Staging] [Is Order Finalized] [bit] NULL, [WWI Supplier ID] [int] NULL, [WWI Stock Item ID] [int] NULL, - [Last Modified When] [datetime2](7) NULL + [Last Modified When] [datetime2](7) NULL, + CONSTRAINT PK_Integration_Purchase_Staging PRIMARY KEY NONCLUSTERED ([Purchase Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1330,8 +1341,7 @@ DROP TABLE IF EXISTS Integration.Sale_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[Sale_Staging] ( - [Sale Staging Key] [bigint] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Sale Staging Key] [bigint] IDENTITY(1,1) NOT NULL, [City Key] [int] NULL, [Customer Key] [int] NULL, [Bill To Customer Key] [int] NULL, @@ -1356,7 +1366,8 @@ CREATE TABLE [Integration].[Sale_Staging] [WWI Bill To Customer ID] [int] NULL, [WWI Stock Item ID] [int] NULL, [WWI Salesperson ID] [int] NULL, - [Last Modified When] [datetime2](7) NULL + [Last Modified When] [datetime2](7) NULL, + CONSTRAINT PK_Integration_Sale_Staging PRIMARY KEY NONCLUSTERED ([Sale Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1371,8 +1382,7 @@ DROP TABLE IF EXISTS Integration.StockHolding_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[StockHolding_Staging] ( - [Stock Holding Staging Key] [bigint] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Stock Holding Staging Key] [bigint] IDENTITY(1,1) NOT NULL, [Stock Item Key] [int] NULL, [Quantity On Hand] [int] NULL, [Bin Location] [nvarchar](20) NULL, @@ -1380,7 +1390,8 @@ CREATE TABLE [Integration].[StockHolding_Staging] [Last Cost Price] [decimal](18, 2) NULL, [Reorder Level] [int] NULL, [Target Stock Level] [int] NULL, - [WWI Stock Item ID] [int] NULL + [WWI Stock Item ID] [int] NULL, + CONSTRAINT PK_Integration_Stock_Holding_Staging PRIMARY KEY NONCLUSTERED ([Stock Holding Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1395,8 +1406,7 @@ DROP TABLE IF EXISTS Integration.StockItem_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[StockItem_Staging] ( - [Stock Item Staging Key] [int] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Stock Item Staging Key] [int] IDENTITY(1,1) NOT NULL, [WWI Stock Item ID] [int] NOT NULL, [Stock Item] [nvarchar](100) NOT NULL, [Color] [nvarchar](20) NOT NULL, @@ -1414,7 +1424,8 @@ CREATE TABLE [Integration].[StockItem_Staging] [Typical Weight Per Unit] [decimal](18, 3) NOT NULL, [Photo] [varbinary](max) NULL, [Valid From] [datetime2](7) NOT NULL, - [Valid To] [datetime2](7) NOT NULL + [Valid To] [datetime2](7) NOT NULL, + CONSTRAINT PK_Integration_Stock_Item_Staging PRIMARY KEY NONCLUSTERED ([Stock Item Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1429,8 +1440,7 @@ DROP TABLE IF EXISTS Integration.Supplier_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[Supplier_Staging] ( - [Supplier Staging Key] [int] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Supplier Staging Key] [int] IDENTITY(1,1) NOT NULL, [WWI Supplier ID] [int] NOT NULL, [Supplier] [nvarchar](100) NOT NULL, [Category] [nvarchar](50) NOT NULL, @@ -1439,7 +1449,8 @@ CREATE TABLE [Integration].[Supplier_Staging] [Payment Days] [int] NOT NULL, [Postal Code] [nvarchar](10) NOT NULL, [Valid From] [datetime2](7) NOT NULL, - [Valid To] [datetime2](7) NOT NULL + [Valid To] [datetime2](7) NOT NULL, + CONSTRAINT PK_Integration_Supplier_Staging PRIMARY KEY NONCLUSTERED ([Supplier Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1454,8 +1465,7 @@ DROP TABLE IF EXISTS Integration.Transaction_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[Transaction_Staging] ( - [Transaction Staging Key] [bigint] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Transaction Staging Key] [bigint] IDENTITY(1,1) NOT NULL, [Date Key] [date] NULL, [Customer Key] [int] NULL, [Bill To Customer Key] [int] NULL, @@ -1477,7 +1487,8 @@ CREATE TABLE [Integration].[Transaction_Staging] [WWI Supplier ID] [int] NULL, [WWI Transaction Type ID] [int] NULL, [WWI Payment Method ID] [int] NULL, - [Last Modified When] [datetime2](7) NULL + [Last Modified When] [datetime2](7) NULL, + CONSTRAINT PK_Integration_Transaction_Staging PRIMARY KEY NONCLUSTERED ([Transaction Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1492,12 +1503,12 @@ DROP TABLE IF EXISTS Integration.TransactionType_Staging;'; SET @SQL = N' CREATE TABLE [Integration].[TransactionType_Staging] ( - [Transaction Type Staging Key] [int] IDENTITY(1,1) NOT NULL - PRIMARY KEY NONCLUSTERED, + [Transaction Type Staging Key] [int] IDENTITY(1,1) NOT NULL, [WWI Transaction Type ID] [int] NOT NULL, [Transaction Type] [nvarchar](50) NOT NULL, [Valid From] [datetime2](7) NOT NULL, [Valid To] [datetime2](7) NOT NULL + CONSTRAINT PK_Integration_Transaction_Type_Staging PRIMARY KEY NONCLUSTERED ([Transaction Type Staging Key]) ) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_ONLY);'; EXECUTE (@SQL); END; @@ -1543,7 +1554,7 @@ FOR VALUES (N''20120101'',N''20130101'',N''20140101'', N''20150101'', N''2016010 BEGIN SET @SQL = N' CREATE PARTITION SCHEME PS_Date -AS PARTITION PF_Date +AS PARTITION PF_Date ALL TO ([USERDATA]);'; EXECUTE (@SQL); PRINT N'Created partition scheme PS_Date'; @@ -2058,7 +2069,6 @@ BEGIN END; DECLARE @OutputCounter varchar(20); - DECLARE @RowCnt int = 0; -- DROP CONSTRAINTS From c6fc5023d91b92dcdfb3c49a1f97ee731a731f78 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Mon, 6 Jun 2016 15:29:42 -0700 Subject: [PATCH 44/73] updating readme with about section --- .gitignore | 3 ++- .../t-sql-scripts/enable-in-memory-oltp.sql | 15 ++++++++------- .../in-memory/ticket-reservations/README.md | 14 +++++++++++++- .../Stored Procedures/BatchInsertReservations.sql | 2 +- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index fd26bf11..966100e2 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateA *.dll samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Release/DemoWorkload.FrmConfig.resources samples/features/in-memory/ticket-reservations/DemoWorkload/bin/Release/DemoWorkload.vshost.exe.config -samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt \ No newline at end of file +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe.config \ No newline at end of file diff --git a/samples/features/in-memory/t-sql-scripts/enable-in-memory-oltp.sql b/samples/features/in-memory/t-sql-scripts/enable-in-memory-oltp.sql index 5f6e0280..7a02bc4c 100644 --- a/samples/features/in-memory/t-sql-scripts/enable-in-memory-oltp.sql +++ b/samples/features/in-memory/t-sql-scripts/enable-in-memory-oltp.sql @@ -46,17 +46,18 @@ ALTER DATABASE CURRENT ADD FILEGROUP ' + QUOTENAME(@MODName) + N' CONTAINS MEMORY_OPTIMIZED_DATA;'; EXECUTE (@SQL); - -- add container in the filegroup - IF NOT EXISTS (SELECT * FROM sys.database_files WHERE data_space_id IN (SELECT data_space_id FROM sys.filegroups WHERE type = N'FX')) - BEGIN - SET @SQL = N' + END; + + -- add container in the filegroup + IF NOT EXISTS (SELECT * FROM sys.database_files WHERE data_space_id IN (SELECT data_space_id FROM sys.filegroups WHERE type = N'FX')) + BEGIN + SET @SQL = N' ALTER DATABASE CURRENT ADD FILE (name = N''' + @MODName + ''', filename = ''' + @MemoryOptimizedFilegroupFolder + N''') TO FILEGROUP ' + QUOTENAME(@MODName); - EXECUTE (@SQL); - END - END; + EXECUTE (@SQL); + END END -- 3. set compat level to 130 if it is lower diff --git a/samples/features/in-memory/ticket-reservations/README.md b/samples/features/in-memory/ticket-reservations/README.md index d3afe497..c71479f7 100644 --- a/samples/features/in-memory/ticket-reservations/README.md +++ b/samples/features/in-memory/ticket-reservations/README.md @@ -1,7 +1,19 @@ -# In-Memory OLTP Performance Improvement Sample +# In-Memory OLTP Performance Improvement Sample This Windows Forms sample application built on .NET Framework 4.6 demonstrates the performance benefits of using SQL Server memory optimized tables and native compiled stored procedures. You can compare the performance before and after enabling In-Memory OLTP by observing the transactions/sec as well as the current CPU Usage and latches/sec. + + + +## About this sample + + +1. **Applies to:** SQL Server 2014 (or higher), Azure SQL Database +1. **Key features:** In-Memory OLTP +1. **Workload:** OLTP +1. **Programming Language:** T-SQL, C# +1. **Authors:** Jos de Bruijn + ![Alt text](Screenshots/1.png "Ticket Reservations") ## Running this sample diff --git a/samples/features/in-memory/ticket-reservations/TicketReservations/dbo/Stored Procedures/BatchInsertReservations.sql b/samples/features/in-memory/ticket-reservations/TicketReservations/dbo/Stored Procedures/BatchInsertReservations.sql index d9e25821..a95bde1b 100644 --- a/samples/features/in-memory/ticket-reservations/TicketReservations/dbo/Stored Procedures/BatchInsertReservations.sql +++ b/samples/features/in-memory/ticket-reservations/TicketReservations/dbo/Stored Procedures/BatchInsertReservations.sql @@ -1,4 +1,4 @@ --- helper stored procedure to +-- helper stored procedure to batch reservations CREATE PROCEDURE BatchInsertReservations(@ServerTransactions int, @RowsPerTransaction int, @ThreadID int) AS From 62e95dca9a25d42cb2b46c9cea40161647e03329 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Mon, 6 Jun 2016 16:11:50 -0700 Subject: [PATCH 45/73] Delete DeploymentReport.txt --- .../bin/Release/DeploymentReport.txt | 34 ------------------- 1 file changed, 34 deletions(-) delete mode 100644 samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/DeploymentReport.txt diff --git a/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/DeploymentReport.txt b/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/DeploymentReport.txt deleted file mode 100644 index be03fc29..00000000 --- a/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/DeploymentReport.txt +++ /dev/null @@ -1,34 +0,0 @@ -** Warnings - User level transactions are not supported for memory optimized objects. You must disable the 'Include transactional - scripts' deployment option to successfully deploy changes to memory optimized objects. - -** Highlights - Tables that will be rebuilt - None - Clustered indexes that will be dropped - [dbo].[sql_ts_th] on [dbo].[TicketReservationDetail] - Clustered indexes that will be created - None - Possible data issues - The table [dbo].[TicketReservationDetail] is being dropped and re-created since all non-computed columns within the - table have been redefined. - -** User actions - Create - [mod] (Filegroup) - [dbo].[TicketReservationDetail] (Table) - [dbo].[InsertReservationDetails] (Procedure) - Drop - [dbo].[InsertReservationDetails] (Procedure) - [dbo].[sql_ts_th] (Primary Key) - [dbo].[TicketReservationDetail] (Table) - Alter - [dbo].[ReadMultipleReservations] (Procedure) - [dbo].[BatchInsertReservations] (Procedure) - -** Supporting actions - Refresh - [dbo].[Demo_Reset] (Procedure) - -The table [dbo].[TicketReservationDetail] is being dropped and re-created since all non-computed columns within the table have been redefined. - From 4a81f3d686a2f355280550c7289680cd93604b87 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Mon, 6 Jun 2016 16:11:56 -0700 Subject: [PATCH 46/73] Delete DeploymentReport_1.txt --- .../bin/Release/DeploymentReport_1.txt | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/DeploymentReport_1.txt diff --git a/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/DeploymentReport_1.txt b/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/DeploymentReport_1.txt deleted file mode 100644 index 4b7c860c..00000000 --- a/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/DeploymentReport_1.txt +++ /dev/null @@ -1,25 +0,0 @@ -** Warnings - User level transactions are not supported for memory optimized objects. You must disable the 'Include transactional - scripts' deployment option to successfully deploy changes to memory optimized objects. - -** Highlights - Tables that will be rebuilt - None - Clustered indexes that will be dropped - None - Clustered indexes that will be created - None - Possible data issues - None - -** User actions - Drop - [dbo].[InsertReservationDetails] (Procedure) - Create - [dbo].[TicketReservationDetail] (Table) - [dbo].[InsertReservationDetails] (Procedure) - Alter - [dbo].[ReadMultipleReservations] (Procedure) - [dbo].[BatchInsertReservations] (Procedure) - -** Supporting actions From 954fe9f0a10bff9abd365877b35953bfc21816a5 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Mon, 6 Jun 2016 16:12:04 -0700 Subject: [PATCH 47/73] Delete TicketReservations.publish.sql --- .../Release/TicketReservations.publish.sql | 258 ------------------ 1 file changed, 258 deletions(-) delete mode 100644 samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/TicketReservations.publish.sql diff --git a/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/TicketReservations.publish.sql b/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/TicketReservations.publish.sql deleted file mode 100644 index d7cd1804..00000000 --- a/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/TicketReservations.publish.sql +++ /dev/null @@ -1,258 +0,0 @@ -/* -Deployment script for TicketReservations - -This code was generated by a tool. -Changes to this file may cause incorrect behavior and will be lost if -the code is regenerated. -*/ - -GO -SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON; - -SET NUMERIC_ROUNDABORT OFF; - - -GO -:setvar DatabaseName "TicketReservations" -:setvar DefaultFilePrefix "TicketReservations" -:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\" -:setvar DefaultLogPath "C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\" - -GO -:on error exit -GO -/* -Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported. -To re-enable the script after enabling SQLCMD mode, execute the following: -SET NOEXEC OFF; -*/ -:setvar __IsSqlCmdEnabled "True" -GO -IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True' - BEGIN - PRINT N'SQLCMD mode must be enabled to successfully execute this script.'; - SET NOEXEC ON; - END - - -GO -PRINT N'Creating [mod]...'; - - -GO -ALTER DATABASE [$(DatabaseName)] - ADD FILEGROUP [mod] CONTAINS MEMORY_OPTIMIZED_DATA; - - -GO -ALTER DATABASE [$(DatabaseName)] - ADD FILE (NAME = [mod_4C0B6475], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_mod_4C0B6475.mdf') TO FILEGROUP [mod]; - - -GO -IF EXISTS (SELECT 1 - FROM [master].[dbo].[sysdatabases] - WHERE [name] = N'$(DatabaseName)') - BEGIN - ALTER DATABASE [$(DatabaseName)] - SET ANSI_NULLS ON, - ANSI_PADDING ON, - ANSI_WARNINGS ON, - ARITHABORT ON, - CONCAT_NULL_YIELDS_NULL ON, - QUOTED_IDENTIFIER ON, - ANSI_NULL_DEFAULT ON, - CURSOR_DEFAULT LOCAL - WITH ROLLBACK IMMEDIATE; - END - - -GO -IF EXISTS (SELECT 1 - FROM [master].[dbo].[sysdatabases] - WHERE [name] = N'$(DatabaseName)') - BEGIN - ALTER DATABASE [$(DatabaseName)] - SET PAGE_VERIFY NONE, - DISABLE_BROKER - WITH ROLLBACK IMMEDIATE; - END - - -GO -IF EXISTS (SELECT 1 - FROM [master].[dbo].[sysdatabases] - WHERE [name] = N'$(DatabaseName)') - BEGIN - ALTER DATABASE [$(DatabaseName)] - SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON - WITH ROLLBACK IMMEDIATE; - END - - -GO -USE [$(DatabaseName)]; - - -GO -/* -The table [dbo].[TicketReservationDetail] is being dropped and re-created since all non-computed columns within the table have been redefined. -*/ - -IF EXISTS (select top 1 1 from [dbo].[TicketReservationDetail]) - RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127) WITH NOWAIT - -GO -PRINT N'Dropping [dbo].[InsertReservationDetails]...'; - - -GO -DROP PROCEDURE [dbo].[InsertReservationDetails]; - - -GO -PRINT N'Dropping [dbo].[sql_ts_th]...'; - - -GO -ALTER TABLE [dbo].[TicketReservationDetail] DROP CONSTRAINT [sql_ts_th]; - - -GO -PRINT N'Dropping [dbo].[TicketReservationDetail]...'; - - -GO -DROP TABLE [dbo].[TicketReservationDetail]; - - -GO -PRINT N'Creating [dbo].[TicketReservationDetail]...'; - - -GO -CREATE TABLE [dbo].[TicketReservationDetail] ( - [TicketReservationID] BIGINT NOT NULL, - [TicketReservationDetailID] BIGINT IDENTITY (1, 1) NOT NULL, - [Quantity] INT NOT NULL, - [FlightID] INT NOT NULL, - [Comment] NVARCHAR (1000) NULL, - CONSTRAINT [PK_TicketReservationDetail] PRIMARY KEY NONCLUSTERED ([TicketReservationDetailID] ASC) -) -WITH (MEMORY_OPTIMIZED = ON); - - -GO -PRINT N'Creating [dbo].[InsertReservationDetails]...'; - - -GO -/* -CREATE PROCEDURE InsertReservationDetails(@TicketReservationID int, @LineCount int, @Comment NVARCHAR(1000), @FlightID int) -AS -BEGIN - DECLARE @loop int = 0; - WHILE (@loop < @LineCount) - BEGIN - INSERT INTO dbo.TicketReservationDetail (TicketReservationID, Quantity, FlightID, Comment) - VALUES(@TicketReservationID, @loop % 8 + 1, @FlightID, @Comment); - SET @loop += 1; - END -END -*/ - - --- natively compiled version of the stored procedure: -CREATE PROCEDURE InsertReservationDetails(@TicketReservationID int, @LineCount int, @Comment NVARCHAR(1000), @FlightID int) -WITH NATIVE_COMPILATION, SCHEMABINDING -as -BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT, LANGUAGE=N'English') - - - DECLARE @loop int = 0; - while (@loop < @LineCount) - BEGIN - INSERT INTO dbo.TicketReservationDetail (TicketReservationID, Quantity, FlightID, Comment) - VALUES(@TicketReservationID, @loop % 8 + 1, @FlightID, @Comment); - SET @loop += 1; - END -END -GO -PRINT N'Altering [dbo].[ReadMultipleReservations]...'; - - -GO -ALTER PROCEDURE ReadMultipleReservations(@ServerTransactions int, @RowsPerTransaction int, @ThreadID int) -AS -BEGIN - DECLARE @tranCount int = 0; - DECLARE @CurrentSeq int = 0; - DECLARE @Sum int = 0; - DECLARE @loop int = 0; - WHILE (@tranCount < @ServerTransactions) - BEGIN - BEGIN TRY - SELECT @CurrentSeq = RAND() * IDENT_CURRENT(N'dbo.TicketReservationDetail') - SET @loop = 0 - BEGIN TRAN - WHILE (@loop < @RowsPerTransaction) - BEGIN - SELECT @Sum += FlightID from dbo.TicketReservationDetail where TicketReservationDetailID = @CurrentSeq - @loop; - SET @loop += 1; - END - COMMIT TRAN - END TRY - BEGIN CATCH - IF XACT_STATE() = -1 - ROLLBACK TRAN - ;THROW - END CATCH - SET @tranCount += 1; - END -END -GO -PRINT N'Altering [dbo].[BatchInsertReservations]...'; - - -GO --- helper stored procedure to - -ALTER PROCEDURE BatchInsertReservations(@ServerTransactions int, @RowsPerTransaction int, @ThreadID int) -AS -BEGIN - DECLARE @tranCount int = 0; - DECLARE @TS Datetime2; - DECLARE @Char_TS NVARCHAR(23); - DECLARE @CurrentSeq int = 0; - - SET @TS = SYSDATETIME(); - SET @Char_TS = CAST(@TS AS NVARCHAR(23)); - WHILE (@tranCount < @ServerTransactions) - BEGIN - BEGIN TRY - BEGIN TRAN - SET @CurrentSeq = NEXT VALUE FOR TicketReservationSequence ; - EXEC InsertReservationDetails @CurrentSeq, @RowsPerTransaction, @Char_TS, @ThreadID; - COMMIT TRAN - END TRY - BEGIN CATCH - IF XACT_STATE() = -1 - ROLLBACK TRAN - ;THROW - END CATCH - SET @tranCount += 1; - END -END -GO -PRINT N'Refreshing [dbo].[Demo_Reset]...'; - - -GO -EXECUTE sp_refreshsqlmodule N'[dbo].[Demo_Reset]'; - - -GO -PRINT N'Update complete.'; - - -GO From 0e136fd0a767e05f0946cb54cdac4942cff0da34 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Mon, 6 Jun 2016 16:12:10 -0700 Subject: [PATCH 48/73] Delete TicketReservations_1.publish.sql --- .../Release/TicketReservations_1.publish.sql | 171 ------------------ 1 file changed, 171 deletions(-) delete mode 100644 samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/TicketReservations_1.publish.sql diff --git a/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/TicketReservations_1.publish.sql b/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/TicketReservations_1.publish.sql deleted file mode 100644 index 140cf5cf..00000000 --- a/samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/TicketReservations_1.publish.sql +++ /dev/null @@ -1,171 +0,0 @@ -/* -Deployment script for TicketReservations - -This code was generated by a tool. -Changes to this file may cause incorrect behavior and will be lost if -the code is regenerated. -*/ - -GO -SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON; - -SET NUMERIC_ROUNDABORT OFF; - - -GO -:setvar DatabaseName "TicketReservations" -:setvar DefaultFilePrefix "TicketReservations" -:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\" -:setvar DefaultLogPath "C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\" - -GO -:on error exit -GO -/* -Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported. -To re-enable the script after enabling SQLCMD mode, execute the following: -SET NOEXEC OFF; -*/ -:setvar __IsSqlCmdEnabled "True" -GO -IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True' - BEGIN - PRINT N'SQLCMD mode must be enabled to successfully execute this script.'; - SET NOEXEC ON; - END - - -GO -USE [$(DatabaseName)]; - - -GO -PRINT N'Dropping [dbo].[InsertReservationDetails]...'; - - -GO -DROP PROCEDURE [dbo].[InsertReservationDetails]; - - -GO -PRINT N'Creating [dbo].[TicketReservationDetail]...'; - - -GO -CREATE TABLE [dbo].[TicketReservationDetail] ( - [TicketReservationID] BIGINT NOT NULL, - [TicketReservationDetailID] BIGINT IDENTITY (1, 1) NOT NULL, - [Quantity] INT NOT NULL, - [FlightID] INT NOT NULL, - [Comment] NVARCHAR (1000) NULL, - CONSTRAINT [PK_TicketReservationDetail] PRIMARY KEY NONCLUSTERED ([TicketReservationDetailID] ASC) -) -WITH (MEMORY_OPTIMIZED = ON); - - -GO -PRINT N'Creating [dbo].[InsertReservationDetails]...'; - - -GO -/* -CREATE PROCEDURE InsertReservationDetails(@TicketReservationID int, @LineCount int, @Comment NVARCHAR(1000), @FlightID int) -AS -BEGIN - DECLARE @loop int = 0; - WHILE (@loop < @LineCount) - BEGIN - INSERT INTO dbo.TicketReservationDetail (TicketReservationID, Quantity, FlightID, Comment) - VALUES(@TicketReservationID, @loop % 8 + 1, @FlightID, @Comment); - SET @loop += 1; - END -END -*/ - - --- natively compiled version of the stored procedure: -CREATE PROCEDURE InsertReservationDetails(@TicketReservationID int, @LineCount int, @Comment NVARCHAR(1000), @FlightID int) -WITH NATIVE_COMPILATION, SCHEMABINDING -as -BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT, LANGUAGE=N'English') - - - DECLARE @loop int = 0; - while (@loop < @LineCount) - BEGIN - INSERT INTO dbo.TicketReservationDetail (TicketReservationID, Quantity, FlightID, Comment) - VALUES(@TicketReservationID, @loop % 8 + 1, @FlightID, @Comment); - SET @loop += 1; - END -END -GO -PRINT N'Altering [dbo].[ReadMultipleReservations]...'; - - -GO -ALTER PROCEDURE ReadMultipleReservations(@ServerTransactions int, @RowsPerTransaction int, @ThreadID int) -AS -BEGIN - DECLARE @tranCount int = 0; - DECLARE @CurrentSeq int = 0; - DECLARE @Sum int = 0; - DECLARE @loop int = 0; - WHILE (@tranCount < @ServerTransactions) - BEGIN - BEGIN TRY - SELECT @CurrentSeq = RAND() * IDENT_CURRENT(N'dbo.TicketReservationDetail') - SET @loop = 0 - BEGIN TRAN - WHILE (@loop < @RowsPerTransaction) - BEGIN - SELECT @Sum += FlightID from dbo.TicketReservationDetail where TicketReservationDetailID = @CurrentSeq - @loop; - SET @loop += 1; - END - COMMIT TRAN - END TRY - BEGIN CATCH - IF XACT_STATE() = -1 - ROLLBACK TRAN - ;THROW - END CATCH - SET @tranCount += 1; - END -END -GO -PRINT N'Altering [dbo].[BatchInsertReservations]...'; - - -GO --- helper stored procedure to - -ALTER PROCEDURE BatchInsertReservations(@ServerTransactions int, @RowsPerTransaction int, @ThreadID int) -AS -BEGIN - DECLARE @tranCount int = 0; - DECLARE @TS Datetime2; - DECLARE @Char_TS NVARCHAR(23); - DECLARE @CurrentSeq int = 0; - - SET @TS = SYSDATETIME(); - SET @Char_TS = CAST(@TS AS NVARCHAR(23)); - WHILE (@tranCount < @ServerTransactions) - BEGIN - BEGIN TRY - BEGIN TRAN - SET @CurrentSeq = NEXT VALUE FOR TicketReservationSequence ; - EXEC InsertReservationDetails @CurrentSeq, @RowsPerTransaction, @Char_TS, @ThreadID; - COMMIT TRAN - END TRY - BEGIN CATCH - IF XACT_STATE() = -1 - ROLLBACK TRAN - ;THROW - END CATCH - SET @tranCount += 1; - END -END -GO -PRINT N'Update complete.'; - - -GO From c68b297c3abc022a8d03e40b03b9d22bf554ccdb Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Tue, 7 Jun 2016 12:11:16 -0700 Subject: [PATCH 49/73] adding conditions for Azure DB --- .gitignore | 3 +- ...onstruct-database-from-metadata-tables.sql | 37 ++++++++++-------- ...wi-configure-required-database-objects.sql | 21 +++++++++- ...onstruct-database-from-metadata-tables.sql | 39 +++++++++++-------- ...dw-configure-required-database-objects.sql | 10 ++++- 5 files changed, 73 insertions(+), 37 deletions(-) diff --git a/.gitignore b/.gitignore index 966100e2..d7086766 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateA samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Release/DemoWorkload.FrmConfig.resources samples/features/in-memory/ticket-reservations/DemoWorkload/bin/Release/DemoWorkload.vshost.exe.config samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt -samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe.config \ No newline at end of file +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe.config +*.zip \ No newline at end of file diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql b/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql index c652d829..6ab0e981 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/2-wwi-construct-database-from-metadata-tables.sql @@ -82,7 +82,9 @@ DECLARE @PrimaryKeyColumn nvarchar(max) = N''; SET @SQL = N''; -SET @SQL += N'USE master;' + @CrLf + @CrLf +-- when not using Azure DB, add create database statement +IF SERVERPROPERTY('EngineEdition') != 5 + SET @SQL += N'USE master;' + @CrLf + @CrLf + N'IF EXISTS(SELECT 1 FROM sys.databases WHERE name = N''WideWorldImporters'')' + @CrLf + N'BEGIN' + @CrLf + N' ALTER DATABASE WideWorldImporters SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' + @CrLf @@ -112,25 +114,26 @@ SET @SQL += N'USE master;' + @CrLf + @CrLf + N' SIZE = 100MB,' + @CrLf + N' MAXSIZE = UNLIMITED,' + @CrLf + N' FILEGROWTH = 64MB' + @CrLf - + N')' + @CrLf - + N'COLLATE Latin1_General_100_CI_AS;' + @CrLf + @GO - + N'ALTER DATABASE WideWorldImporters SET RECOVERY SIMPLE;' + @CrLf + @GO - + N'ALTER DATABASE WideWorldImporters SET AUTO_UPDATE_STATISTICS_ASYNC ON;' + @CrLf + @GO - + N'ALTER AUTHORIZATION ON DATABASE::WideWorldImporters to sa;' + @CrLf + @GO - + N'ALTER DATABASE WideWorldImporters' + @CrLf - + N'SET QUERY_STORE' + @CrLf - + N'(' + @CrLf - + @Indent + N'OPERATION_MODE = READ_WRITE,' + @CrLf - + @Indent + N'CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),' + @CrLf - + @Indent + N'DATA_FLUSH_INTERVAL_SECONDS = 3000,' + @CrLf - + @Indent + N'MAX_STORAGE_SIZE_MB = 500,' + @CrLf - + @Indent + N'INTERVAL_LENGTH_MINUTES = 15,' + @CrLf - + @Indent + N'SIZE_BASED_CLEANUP_MODE = AUTO,' + @CrLf - + @Indent + N'QUERY_CAPTURE_MODE = AUTO,' + @CrLf - + @Indent + N'MAX_PLANS_PER_QUERY = 1000' + @CrLf + N');' + @CrLf + @GO + + N'ALTER AUTHORIZATION ON DATABASE::WideWorldImporters to sa;' + @CrLf + @GO + N'USE WideWorldImporters;' + @CrLf + @GO; + SET @SQL += N'ALTER DATABASE CURRENT COLLATE Latin1_General_100_CI_AS;' + @CrLf + @GO + + N'ALTER DATABASE CURRENT SET RECOVERY SIMPLE;' + @CrLf + @GO + + N'ALTER DATABASE CURRENT SET AUTO_UPDATE_STATISTICS_ASYNC ON;' + @CrLf + @GO + + N'ALTER DATABASE CURRENT' + @CrLf + + N'SET QUERY_STORE' + @CrLf + + N'(' + @CrLf + + @Indent + N'OPERATION_MODE = READ_WRITE,' + @CrLf + + @Indent + N'CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),' + @CrLf + + @Indent + N'DATA_FLUSH_INTERVAL_SECONDS = 3000,' + @CrLf + + @Indent + N'MAX_STORAGE_SIZE_MB = 500,' + @CrLf + + @Indent + N'INTERVAL_LENGTH_MINUTES = 15,' + @CrLf + + @Indent + N'SIZE_BASED_CLEANUP_MODE = AUTO,' + @CrLf + + @Indent + N'QUERY_CAPTURE_MODE = AUTO,' + @CrLf + + @Indent + N'MAX_PLANS_PER_QUERY = 1000' + @CrLf + + N');' + @CrLf + @GO + DECLARE SchemaList CURSOR FAST_FORWARD READ_ONLY FOR SELECT SchemaName, SchemaDescription diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql index 0d5917c1..f4aaea52 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql @@ -4626,19 +4626,38 @@ FOR VALUES (N''20140101'', N''20150101'', N''20160101'', N''20170101'');'; IF NOT EXISTS (SELECT * FROM sys.partition_schemes WHERE name = N'PS_TransactionDateTime') BEGIN - SET @SQL = N' + + -- for Azure DB, assign to primary filegroup + IF SERVERPROPERTY('EngineEdition') = 5 + SET @SQL = N' +CREATE PARTITION SCHEME PS_TransactionDateTime +AS PARTITION PF_TransactionDateTime +ALL TO ([PRIMARY]);'; + -- for other engine editions, assign to user data filegroup + IF SERVERPROPERTY('EngineEdition') != 5 + SET @SQL = N' CREATE PARTITION SCHEME PS_TransactionDateTime AS PARTITION PF_TransactionDateTime ALL TO ([USERDATA]);'; + EXECUTE (@SQL); END; IF NOT EXISTS (SELECT 1 FROM sys.partition_schemes WHERE name = N'PS_TransactionDate') BEGIN + -- for Azure DB, assign to primary filegroup + IF SERVERPROPERTY('EngineEdition') = 5 + SET @SQL = N' +CREATE PARTITION SCHEME PS_TransactionDate +AS PARTITION PF_TransactionDate +ALL TO ([PRIMARY]);'; + -- for other engine editions, assign to user data filegroup + IF SERVERPROPERTY('EngineEdition') != 5 SET @SQL = N' CREATE PARTITION SCHEME PS_TransactionDate AS PARTITION PF_TransactionDate ALL TO ([USERDATA]);'; + EXECUTE (@SQL); END; diff --git a/samples/databases/wide-world-importers/wwi-dw-database-scripts/2-wwi-dw-construct-database-from-metadata-tables.sql b/samples/databases/wide-world-importers/wwi-dw-database-scripts/2-wwi-dw-construct-database-from-metadata-tables.sql index 7655a32f..1ed55a3e 100644 --- a/samples/databases/wide-world-importers/wwi-dw-database-scripts/2-wwi-dw-construct-database-from-metadata-tables.sql +++ b/samples/databases/wide-world-importers/wwi-dw-database-scripts/2-wwi-dw-construct-database-from-metadata-tables.sql @@ -72,7 +72,9 @@ DECLARE @PrimaryKeyColumn nvarchar(max) = N''; SET @SQL = N''; -SET @SQL += N'USE master;' + @CrLf + @CrLf +-- when not using Azure DB, add create database statement +IF SERVERPROPERTY('EngineEdition') != 5 + SET @SQL += N'USE master;' + @CrLf + @CrLf + N'IF EXISTS(SELECT 1 FROM sys.databases WHERE name = N''WideWorldImportersDW'')' + @CrLf + N'BEGIN' + @CrLf + N' ALTER DATABASE WideWorldImportersDW SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' + @CrLf @@ -102,25 +104,28 @@ SET @SQL += N'USE master;' + @CrLf + @CrLf + N' SIZE = 100MB,' + @CrLf + N' MAXSIZE = UNLIMITED,' + @CrLf + N' FILEGROWTH = 64MB' + @CrLf - + N')' + @CrLf - + N'COLLATE Latin1_General_100_CI_AS;' + @CrLf + @GO - + N'ALTER DATABASE WideWorldImportersDW SET RECOVERY SIMPLE;' + @CrLf + @GO - + N'ALTER DATABASE WideWorldImporters SET AUTO_UPDATE_STATISTICS_ASYNC ON;' + @CrLf + @GO - + N'ALTER AUTHORIZATION ON DATABASE::WideWorldImportersDW to sa;' + @CrLf + @GO - + N'ALTER DATABASE WideWorldImportersDW' + @CrLf - + N'SET QUERY_STORE' + @CrLf - + N'(' + @CrLf - + @Indent + N'OPERATION_MODE = READ_WRITE,' + @CrLf - + @Indent + N'CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),' + @CrLf - + @Indent + N'DATA_FLUSH_INTERVAL_SECONDS = 3000,' + @CrLf - + @Indent + N'MAX_STORAGE_SIZE_MB = 500,' + @CrLf - + @Indent + N'INTERVAL_LENGTH_MINUTES = 15,' + @CrLf - + @Indent + N'SIZE_BASED_CLEANUP_MODE = AUTO,' + @CrLf - + @Indent + N'QUERY_CAPTURE_MODE = AUTO,' + @CrLf - + @Indent + N'MAX_PLANS_PER_QUERY = 1000' + @CrLf + N');' + @CrLf + @GO + + N'ALTER AUTHORIZATION ON DATABASE::WideWorldImportersDW to sa;' + @CrLf + @GO + N'USE WideWorldImportersDW;' + @CrLf + @GO; + +SET @SQL += N'ALTER DATABASE CURRENT COLLATE Latin1_General_100_CI_AS;' + @CrLf + @GO + + N'ALTER DATABASE CURRENT SET RECOVERY SIMPLE;' + @CrLf + @GO + + N'ALTER DATABASE CURRENT SET AUTO_UPDATE_STATISTICS_ASYNC ON;' + @CrLf + @GO + + N'ALTER DATABASE CURRENT' + @CrLf + + N'SET QUERY_STORE' + @CrLf + + N'(' + @CrLf + + @Indent + N'OPERATION_MODE = READ_WRITE,' + @CrLf + + @Indent + N'CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),' + @CrLf + + @Indent + N'DATA_FLUSH_INTERVAL_SECONDS = 3000,' + @CrLf + + @Indent + N'MAX_STORAGE_SIZE_MB = 500,' + @CrLf + + @Indent + N'INTERVAL_LENGTH_MINUTES = 15,' + @CrLf + + @Indent + N'SIZE_BASED_CLEANUP_MODE = AUTO,' + @CrLf + + @Indent + N'QUERY_CAPTURE_MODE = AUTO,' + @CrLf + + @Indent + N'MAX_PLANS_PER_QUERY = 1000' + @CrLf + + N');' + @CrLf + @GO + + DECLARE SchemaList CURSOR FAST_FORWARD READ_ONLY FOR SELECT SchemaName, SchemaDescription diff --git a/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql index a4f641c3..8c8c0582 100644 --- a/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql @@ -1552,7 +1552,15 @@ FOR VALUES (N''20120101'',N''20130101'',N''20140101'', N''20150101'', N''2016010 IF NOT EXISTS (SELECT 1 FROM sys.partition_schemes WHERE name = N'PS_Date') BEGIN - SET @SQL = N' + -- for Azure DB, assign to primary filegroup + IF SERVERPROPERTY('EngineEdition') = 5 + SET @SQL = N' +CREATE PARTITION SCHEME PS_Date +AS PARTITION PF_Date +ALL TO ([PRIMARY]);'; + -- for other engine editions, assign to user data filegroup + IF SERVERPROPERTY('EngineEdition') != 5 + SET @SQL = N' CREATE PARTITION SCHEME PS_Date AS PARTITION PF_Date ALL TO ([USERDATA]);'; From f0de5ce0a77f802fccc1aceab9d535fae09c617d Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Tue, 7 Jun 2016 15:45:49 -0700 Subject: [PATCH 50/73] update --- .../wwi-database-scripts/3-wwi-recreate.sql | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql b/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql index 4429f881..0cb46820 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/3-wwi-recreate.sql @@ -31,20 +31,25 @@ LOG ON SIZE = 100MB, MAXSIZE = UNLIMITED, FILEGROWTH = 64MB -) -COLLATE Latin1_General_100_CI_AS; -GO - -ALTER DATABASE WideWorldImporters SET RECOVERY SIMPLE; -GO - -ALTER DATABASE WideWorldImporters SET AUTO_UPDATE_STATISTICS_ASYNC ON; +); GO ALTER AUTHORIZATION ON DATABASE::WideWorldImporters to sa; GO -ALTER DATABASE WideWorldImporters +USE WideWorldImporters; +GO + +ALTER DATABASE CURRENT COLLATE Latin1_General_100_CI_AS; +GO + +ALTER DATABASE CURRENT SET RECOVERY SIMPLE; +GO + +ALTER DATABASE CURRENT SET AUTO_UPDATE_STATISTICS_ASYNC ON; +GO + +ALTER DATABASE CURRENT SET QUERY_STORE ( OPERATION_MODE = READ_WRITE, @@ -58,9 +63,6 @@ SET QUERY_STORE ); GO -USE WideWorldImporters; -GO - CREATE SCHEMA [Application] AUTHORIZATION dbo; GO EXEC sys.sp_addextendedproperty @name = N'Description', @value = N'Tables common across the application. Used for categorization and lookup lists, system parameters and people (users and contacts)', @level0type = N'SCHEMA', @level0name = 'Application'; From 5c700232d985a38a024ec8b382499767904f31a3 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Tue, 7 Jun 2016 16:48:19 -0700 Subject: [PATCH 51/73] documentation is moved to MSDN --- .../documentation/README.md | 7 - .../documentation/root.md | 68 ------ .../documentation/wwi-data-generation.md | 39 ---- .../documentation/wwi-etl.md | 58 ----- .../documentation/wwi-olap-catalog.md | 82 ------- .../documentation/wwi-olap-installation.md | 54 ----- .../documentation/wwi-olap-sample-queries.md | 5 - .../documentation/wwi-olap-sql-features.md | 95 -------- .../documentation/wwi-oltp-htap-catalog.md | 202 ------------------ .../wwi-oltp-htap-installation.md | 63 ------ .../wwi-oltp-htap-sample-queries.md | 5 - .../wwi-oltp-htap-sql-features.md | 27 --- .../documentation/wwi-overview.md | 49 ----- 13 files changed, 754 deletions(-) delete mode 100644 samples/databases/wide-world-importers/documentation/README.md delete mode 100644 samples/databases/wide-world-importers/documentation/root.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-data-generation.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-etl.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-olap-installation.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-olap-sample-queries.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-olap-sql-features.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sample-queries.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md delete mode 100644 samples/databases/wide-world-importers/documentation/wwi-overview.md diff --git a/samples/databases/wide-world-importers/documentation/README.md b/samples/databases/wide-world-importers/documentation/README.md deleted file mode 100644 index 72f6c331..00000000 --- a/samples/databases/wide-world-importers/documentation/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Documentation for the WideWorldImporters Sample Database - -This folder contains documentation for the sample. - -Start with [root.md](root.md) - -Note that these contents will most likely be migrated to MSDN. diff --git a/samples/databases/wide-world-importers/documentation/root.md b/samples/databases/wide-world-importers/documentation/root.md deleted file mode 100644 index dfdad25c..00000000 --- a/samples/databases/wide-world-importers/documentation/root.md +++ /dev/null @@ -1,68 +0,0 @@ -# Wide World Importers Sample for SQL Server and Azure SQL Database - -Wide World Importers is a comprehensive database sample that both illustrates database design, and illustrates how SQL Server features can be leveraged in an application. - -Note that the sample is meant to be representative of a typical database. It does not include every feature of SQL Server. The design of the database follows one common set of standards, but there are many ways one might build a database. - -**Latest release**: -[wide-world-importers-release](http://go.microsoft.com/fwlink/?LinkID=800630) - -**Source code for the sample**: -[wide-world-importers](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers). - -**Feedback**: please send to -[sqlserversamples@microsoft.com](mailto:sqlserversamples@microsoft.com). - -The documentation for the sample is organized as follows: - -## Overview - -__[Wide World Importers Overview](wwi-overview.md)__ - -Overview of the sample company Wide World Importers, and the workflows addressed by the sample. - -## Main OLTP Database WideWorldImporters - -__[WideWorldImporters Installation and Configuration](wwi-oltp-htap-installation.md)__ - -Instructions for the installation and configuration of the core database WideWorldImporters that is used for transaction processing (OLTP - OnLine Transaction Processing) and operational analytics (HTAP - Hybrid Transactional/Analytical Processing). - -__[WideWorldImporters Database Catalog](wwi-oltp-htap-catalog.md)__ - -Description of the schemas and tables used in the WideWorldImporters database. - -__[WideWorldImporters Use of SQL Server Features and Capabilities](wwi-oltp-htap-sql-features.md)__ - -Describes how WideWorldImporters leverages core SQL Server features. - -__[WideWorldImporters Sample Queries](wwi-oltp-htap-sample-queries.md)__ - -Sample queries for the WideWorldImporters database. - -## Data Warehousing and Analytics Database WideWorldImportersDW - -__[WideWorldImportersDW Installation and Configuration](wwi-olap-installation.md)__ - -Instructions for the installation and configuration of the OLAP database WideWorldImportersDW. - -__[WideWorldImportersDW OLAP Database Catalog](wwi-olap-catalog.md)__ - -Description of the schemas and tables used in the WideWorldImportersDW database, which is the sample database for data warehousing and analytics processing (OLAP). - -__[WideWorldImporters ETL Workflow](wwi-etl.md)__ - -Workflow for the ETL (Extract, Transform, Load) process that migrates data from the transactional database WideWorldImporters to the data warehouse WideWorldImportersDW. - -__[WideWorldImportersDW Use of SQL Server Features and Capabilities](wwi-olap-sql-features.md)__ - -Describes how the WideWorldImportersDW leverages SQL Server features for analytics processing. - -__[WideWorldImportersDW OLAP Sample Queries](wwi-olap-sample-queries.md)__ - -Sample analytics queries leveraging the WideWorldImportersDW database. - -## Data generation - -__[WideWorldImporters Data Generation](wwi-data-generation.md)__ - -Describes how additional data can be generated in the sample database, for example inserting sales and purchase data up to the current date. diff --git a/samples/databases/wide-world-importers/documentation/wwi-data-generation.md b/samples/databases/wide-world-importers/documentation/wwi-data-generation.md deleted file mode 100644 index 1ed9df1b..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-data-generation.md +++ /dev/null @@ -1,39 +0,0 @@ -# WideWorldImporters Data Generation - -The released versions of the WideWorldImporters and WideWorldImportersDW databases contains data starting January 1st 2013, up to the day these databases were generated. - -If the sample databases are used at a later date, for demonstration or illustration purposes, it may be beneficial to include more recent sample data in the database. - -## Data Generation in WideWorldImporters - -To generate sample data up to the current date, follow these steps: - -1. If you have not yet done so, install a clean version of the WideWorldImporters database. For installation instructions, [WideWorldImporters Installation and Configuration](wwi-oltp-htap-installation.md). -2. Execute the following statement in the database: - -``` - EXEC DataLoadSimulation.PopulateDataToCurrentDate - @AverageNumberOfCustomerOrdersPerDay = 60, - @SaturdayPercentageOfNormalWorkDay = 50, - @SundayPercentageOfNormalWorkDay = 0, - @IsSilentMode = 1, - @AreDatesPrinted = 1; -``` - -This statement adds sample sales and purchase data in the database, up to the current date. It outputs the progress of the data generation day-by-day. It will take rougly 10 minutes for every year that needs data. Note that there are some differences in the data generated between runs, since there is a random factor in the data generation. - -To increase or decrease the amount of data generated, in terms of orders per day, change the value for the parameter `@AverageNumberOfCustomerOrdersPerDay`. The parameters `@SaturdayPercentageOfNormalWorkDay` and `@SundayPercentageOfNormalWorkDay` are used to determine the order volume for weekend days. - -## Importing Data in WideWorldImportersDW - -To import sample data up to the current date in the OLAP database WideWorldImportersDW, follow these steps: - -1. Execute the data generation logic in the WideWorldImporters OLTP database, using the steps above. -2. If you have not yet done so, install a clean version of the WideWorldImportersDW database. For installation instructions, [WideWorldImporters Installation and Configuration](wwi-olap-installation.md). -3. Reseed the OLAP database by executing the following statement in the database: - -``` - EXECUTE [Application].Configuration_ReseedETL -``` - -4. Run the SSIS package **Daily ETL.ispac** to import the data into the OLAP database. For instructions on how to run the ETL job, see [WideWorldImporters ETL Workflow](wwi-etl.md). diff --git a/samples/databases/wide-world-importers/documentation/wwi-etl.md b/samples/databases/wide-world-importers/documentation/wwi-etl.md deleted file mode 100644 index a88e18a1..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-etl.md +++ /dev/null @@ -1,58 +0,0 @@ -# WideWorldImporters ETL Workflow - -The ETL package WWI_Integration is used to migrate data from the WideWorldImporters database to the WideWorldImportersDW database as the data changes. The package is run periodically (most commonly daily). - -## Overview - -The design of the package uses SQL Server Integration Services (SSIS) to orchestrate bulk T-SQL operations (rather than as separate transformations within SSIS) to ensure high performance. - -Dimensions are loaded first, followed by Fact tables. The package can be re-run at any time after a failure. - -The workflow is as follows: - -![Alt text](/media/wide-world-importers-etl-workflow.png "WideWorldImporters ETL Workflow") - -It starts with an expression task that works out the appropriate cutoff time. This time is the current time less a few seconds. (This is more robust than requesting data right to the current time). It then truncates any milliseconds from the time. - -The main processing starts by populating the Date dimension table. It ensures that all dates for the current year have been populated in the table. - -After this, a series of data flow tasks loads each dimension, then each fact. - -## Prerequisites - -- SQL Server 2016 (or higher) with the databases WideWorldImporters and WideWorldImportersDW. These can be on the same or different instances of SQL Server. -- SQL Server Management Studio (SSMS) -- SQL Server 2016 Integration Services (SSIS). - - Make sure you have created an SSIS Catalog. If not, right click **Integration Services** in SSMS Object Explorer, and choose **Add Catalog**. Follow the defaults. It will ask you to enable sqlclr and provide a password. - - -## Download - -The latest release of the sample: - -[wide-world-importers-v0.1](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v0.1) - -Download the SSIS package file **Daily ETL.ispac**. - -Source code to recreate the sample database is available from the following location. - -[wide-world-importers](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers/wwi-integration-etl) - -## Install - -1. Deploy the SSIS package. - - Open the "Daily ETL.ispac" package from Windows Explorer. This will launch the Integration Services Deployment Wizard. - - Under "Select Source" follow the default Project Deployment, with the path pointing to the "Daily ETL.ispac" package. - - Under "Select Destination" enter the name of the server that hosts the SSIS catalog. - - Select a path under the SSIS catalog, for example under a new folder "WideWorldImporters". - - Finalize the wizard by clicking Deploy. - -2. Create a SQL Server Agent job for the ETL process. - - In SSMS, right-click "SQL Server Agent" and select New->Job. - - Pick a name, for example "WideWorldImporters ETL". - - Add a Job Step of type "SQL Server Integration Services Package". - - Select the server with the SSIS catalog, and select the "Daily ETL" package. - - Under Configuration->Connection Managers ensure the connections to the source and target are configured correctly. The default is to connect to the local instance. - - Click OK to create the Job. - -3. Execute or schedule the Job. diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md b/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md deleted file mode 100644 index 88e5c093..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-catalog.md +++ /dev/null @@ -1,82 +0,0 @@ -# WideWorldImportersDW OLAP Database Catalog - -The WideWorldImportersDW database is used for data warehousing and analytical processing. The transactional data about sales and purchases is generated in the WideWorldImporters database, and loaded into the WideWorldImportersDW database using a [daily ETL process](wwi-etl.md). - -The data in WideWorldImportersDW thus mirrors the data in WideWorldImporters, but the tables are organized differently. While WideWorldImporters has a traditional normalized schema, WideWorldImportersDW uses the [star schema](https://wikipedia.org/wiki/Star_schema) approach for its table design. Besides the fact and dimension tables, the database includes a number of staging tables that are used in the ETL process. - -## Schemas - -The different types of tables are organized in three schemas. - -|Schema|Description| -|-----------------------------|---------------------| -|Dimension|Dimension tables.| -|Fact|Fact tables.| -|Integration|Staging tables and other objects needed for ETL.| - -## Tables - -The dimension and fact tables are listed below. The tables in the Integration schema are used only for the ETL process, and are not listed. - -### Dimension tables - -WideWorldImportersDW has the following dimension tables. The description includes the relationship with the source tables in the WideWorldImporters database. - -|Table|Source tables| -|-----------------------------|---------------------| -|City|`Application.Cities`, `Application.StateProvinces`, `Application.Countries`.| -|Customer|`Sales.Customers`, `Sales.BuyingGroups`, `Sales.CustomerCategories`.| -|Date|New table with information about dates, including financial year (based on November 1st start for financial year).| -|Employee|`Application.People`.| -|StockItem|`Warehouse.StockItems`, `Warehouse.Colors`, `Warehouse.PackageType`.| -|Supplier|`Purchasing.Suppliers`, `Purchasing.SupplierCategories`.| -|PaymentMethod|`Application.PaymentMethods`.| -|TransactionType|`Application.TransactionTypes`.| - -### Fact tables - -WideWorldImportersDW has the following fact tables. The description includes the relationship with the source tables in the WideWorldImporters database, as well as the classes of analytics/reporting queries each fact table is typically used with. - -|Table|Source tables|Sample Analytics| -|-----------------------------|---------------------|---------------------| -|Order|`Sales.Orders` and `Sales.OrderLines`|Sales people, picker/packer productivity, and on time to pick orders. In addition, low stock situations leading to back orders.| -|Sale|`Sales.Invoices` and `Sales.InvoiceLines`|Sales dates, delivery dates, profitability over time, profitability by sales person.| -|Purchase|`Purchasing.PurchaseOrderLines`|Expected vs actual lead times| -|Transaction|`Sales.CustomerTransactions` and `Purchasing.SupplierTransactions`|Measuring issue dates vs finalization dates, and amounts.| -|Movement|`Warehouse.StockTransactions`|Movements over time.| -|Stock Holding|`Warehouse.StockItemHoldings`|On-hand stock levels and value.| - -## Stored procedures - -The stored procedures are used primarily for the ETL process and for configuration purposes. - -Any extensions of the sample are encouraged to use the `Reports` schema for Reporting Services reports, and the `PowerBI` schema for Power-BI access. - -### Application Schema - -These procedures are used to configure the sample. They are used to apply enterprise edition features to the standard edition version of the sample, add PolyBase, and reseed ETL. - -|Procedure|Purpose| -|-----------------------------|---------------------| -|Configuration_ApplyPartitionedColumnstoreIndexing|Applies both partitioning and columnstore indexes for fact tables.| -|Configuration_ConfigureForEnterpriseEdition|Applies partitioning, columnstore indexing and in-memory.| -|Configuration_EnableInMemory|Replaces the integration staging tables with SCHEMA_ONLY memory-optimized tables to improve ETL performance.| -|Configuration_ApplyPolybase|Configures an external data source, file format, and table.| -|Configuration_PopulateLargeSaleTable|Applied enterprise edition changes, then populates a larger amount of data for the 2012 calendar year as additional history.| -|Configuration_ReseedETL|Removes existing data and restarts the ETL seeds. This allows for repopulating the OLAP database to match updated rows in the OLTP database.| - -### Integration Schema - -Procedures used in the ETL process fall in these categories: -- Helper procedures for the ETL package - All Get* procedures. -- Procedures used by the ETL package for migrating staged data into the DW tables - All Migrate* procedures. -- `PopulateDateDimensionForYear` - Takes a year and ensures that all dates for that year are populated in the `Dimension.Date` table. - -### Sequences Schema - -Procedures to configure the sequences in the database. - -|Procedure|Purpose| -|-----------------------------|---------------------| -|ReseedAllSequences|Calls the procedure `ReseedSequenceBeyondTableValue` for all sequences.| -|ReseedSequenceBeyondTableValue|Used to reposition the next sequence value beyond the value in any table that uses the same sequence. (Like a `DBCC CHECKIDENT` for identity columns equivalent for sequences but across potentially multiple tables).| diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md b/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md deleted file mode 100644 index fcfa2c90..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-installation.md +++ /dev/null @@ -1,54 +0,0 @@ -# WideWorldImportersDW Installation and Configuration - - -- [SQL Server 2016](https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016) (or higher) or [Azure SQL Database](https://azure.microsoft.com/services/sql-database/). To use the Full version of the sample, use SQL Server Evaluation/Developer/Enterprise Edition. -- [SQL Server Management Studio](https://msdn.microsoft.com/library/mt238290.aspx). For the best results use the April 2016 preview or later. - -## Download - -The latest release of the sample: - -[wide-world-importers-release](http://go.microsoft.com/fwlink/?LinkID=800630) - -Download the sample WideWorldImportersDW database backup/bacpac that corresponds to your edition of SQL Server or Azure SQL Database. - -Source code to recreate the sample database is available from the following location. Note that data population is based on ETL from the OLTP database (WideWorldImporters): - -[wide-world-importers-source](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers/wwi-dw-database-scripts) - -## Install - - -### SQL Server - -To restore a backup to a SQL Server instance, you can use Management Studio. - -1. Open SQL Server Management Studio and connect to the target SQL Server instance. -2. Right-click on the **Databases** node, and select **Restore Database**. -3. Select **Device** and click on the button **...** -4. In the dialog **Select backup devices**, click **Add**, navigate to the database backup in the filesystem of the server, and select the backup. Click **OK**. -5. If needed, change the target location for the data and log files, in the **Files** pane. Note that it is best practice to place data and log files on different drives. -6. Click **OK**. This will initiate the database restore. After it completes, you will have the database WideWorldImporters installed on your SQL Server instance. - -### Azure SQL Database - -To import a bacpac into a new SQL Database, you can use Management Studio. - -1. (optional) If you do not yet have a SQL Server in Azure, navigate to the [Azure portal](https://portal.azure.com/) and create a new SQL Database. In the process of create a database, you will create a server. Make note of the server. - - See [this tutorial](https://azure.microsoft.com/documentation/articles/sql-database-get-started/) to create a database in minutes -2. Open SQL Server Management Studio and connect to your server in Azure. -3. Right-click on the **Databases** node, and select **Import Data-Tier Application**. -4. In the **Import Settings** select **Import from local disk** and select the bacpac of the sample database from your file system. -5. Under **Database Settings** change the database name to *WideWorldImportersDW* and select the target edition and service objective to use. -6. Click **Next** and **Finish** to kick off deployment. It will take a few minutes to complete. When specifying a service objective lower than S2 it may take longer. - -## Configuration - -[Applies to SQL Server 2016 (and later) Developer/Evaluation/Enterprise Edition] - -The sample database can make use of PolyBase to query files in Hadoop or Azure blob storage. However, that feature is not installed by default with SQL Server - you need to select it during SQL Server setup. Therefore, a post-installation step is required. - -1. In SQL Server Management Studio, connect to the WideWorldImportersDW database and open a new query window. -2. Run the following T-SQL command to enable the use of PolyBase in the database: - - EXECUTE [Application].[Configuration_ApplyPolyBase] diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-sample-queries.md b/samples/databases/wide-world-importers/documentation/wwi-olap-sample-queries.md deleted file mode 100644 index 171bbe72..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-sample-queries.md +++ /dev/null @@ -1,5 +0,0 @@ -# WideWorldImportersDW OLAP Sample Queries - -Refer to the sample-scripts.zip file that is included with the release of the sample, or refer to the source code: - -[wide-world-importers/sample-scripts](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers/sample-scripts) diff --git a/samples/databases/wide-world-importers/documentation/wwi-olap-sql-features.md b/samples/databases/wide-world-importers/documentation/wwi-olap-sql-features.md deleted file mode 100644 index 99921b6d..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-olap-sql-features.md +++ /dev/null @@ -1,95 +0,0 @@ -# WideWorldImportersDW Use of SQL Server Features and Capabilities - -WideWorldImportersDW is designed to showcase many of the key features of SQL Server that are suitable for data warehousing and analytics. The following is a list of SQL Server features and capabilities, and a description of how they are used in WideWorldImportersDW. - -## PolyBase - -[Applies to SQL Server (2016 and later)] - -PolyBase is used to combine sales information from WideWorldImportersDW with a public data set about demographics to understand which cities might be of interest for further expansion of sales. - -To enable the use of PolyBase in the sample database, make sure it is installed, and run the following stored procedure in the database: - - EXEC [Application].[Configuration_ApplyPolybase] - -This will create an external table `dbo.CityPopulationStatistics` that references a public data set that contains population data for cities in the United States, hosted in Azure blob storage. You are encouraged to review the code in the stored procedure to understand the configuration process. If you want to host your own data in Azure blob storage and keep it secure from general public access, you will need to undertake additional configuration steps. The following query returns the data from that external data set: - - SELECT CityID, StateProvinceCode, CityName, YearNumber, LatestRecordedPopulation FROM dbo.CityPopulationStatistics; - -To understand which cities might be of interest for further expansion, the following query looks at the growth rate of cities, and returns the top 100 largest cities with significant growth, and where Wide World Importers does not have a sales presence. The query involves a join between the remote table `dbo.CityPopulationStatistics` and the local table `Dimension.City`, and a filter involving the local table `Fact.Sales`. - - WITH PotentialCities - AS - ( - SELECT cps.CityName, - cps.StateProvinceCode, - MAX(cps.LatestRecordedPopulation) AS PopulationIn2016, - (MAX(cps.LatestRecordedPopulation) - MIN(cps.LatestRecordedPopulation)) * 100.0 - / MIN(cps.LatestRecordedPopulation) AS GrowthRate - FROM dbo.CityPopulationStatistics AS cps - WHERE cps.LatestRecordedPopulation IS NOT NULL - AND cps.LatestRecordedPopulation <> 0 - GROUP BY cps.CityName, cps.StateProvinceCode - ), - InterestingCities - AS - ( - SELECT DISTINCT pc.CityName, - pc.StateProvinceCode, - pc.PopulationIn2016, - FLOOR(pc.GrowthRate) AS GrowthRate - FROM PotentialCities AS pc - INNER JOIN Dimension.City AS c - ON pc.CityName = c.City - WHERE GrowthRate > 2.0 - AND NOT EXISTS (SELECT 1 FROM Fact.Sale AS s WHERE s.[City Key] = c.[City Key]) - ) - SELECT TOP(100) CityName, StateProvinceCode, PopulationIn2016, GrowthRate - FROM InterestingCities - ORDER BY PopulationIn2016 DESC; - -## Clustered Columnstore Indexes - -(Full version of the sample) - -Clustered Columnstore Indexes (CCI) are used with all the fact tables, to reduce storage footprint and improve query performance. With the use of CCI, the base storage for the fact tables uses column compression. - -Nonclustered indexes are used on top of the clustered columnstore index, to facilitate primary key and foreign key constraints. These constraints were added out of an abundance of caution - the ETL process sources the data from the WideWorldImporters database, which has constraints to enforce integrity. Removing primary and foreign key constraints, and their supporting indexes, would reduce the storage footprint of the fact tables. - -**Data size** - -The sample database has limited data size, to make it easy to download and install the sample. However, to see the real performance benefits of columnstore indexes, you would want to use a larger data set. - -You can run the following statement to increase the size of the `Fact.Sales` table by inserting another 12 million rows of sample data. These rows are all inserted for the year 2012, such that there is no interference with the ETL process. - - EXECUTE [Application].[Configuration_PopulateLargeSaleTable] - -This statement will take around 5 minutes to run. To insert more than 12 million rows, pass the desired number of rows to insert as a parameter to this stored procedure. - -To compare query performance with and without columnstore, you can drop and/or recreate the clustered columnstore index. - -To drop the index: - - DROP INDEX [CCX_Fact_Order] ON [Fact].[Order] - -To recreate: - - CREATE CLUSTERED COLUMNSTORE INDEX [CCX_Fact_Order] ON [Fact].[Order] - -## Partitioning - -(Full version of the sample) - -Data size in a Data Warehouse can grow very large. Therefore it is best practice to use partitioning to manage the storage of the large tables in the database. - -All of the larger fact tables are partitioned by year. The only exception is `Fact.Stock Holdings`, which is not date-based and has limited data size compared with the other fact tables. - -The partition function used for all partitioned tables is `PF_Date`, and the partition scheme being used is `PS_Date`. - -## In-Memory OLTP - -(Full version of the sample) - -WideWorldImportersDW uses SCHEMA_ONLY memory-optimized tables for the staging tables. All `Integration.`\*`_Staging` tables are SCHEMA_ONLY memory-optimized tables. - -The advantage of SCHEMA_ONLY tables is that they are not logged, and do not require any disk access. This improves the performance of the ETL process. Since these tables are not logged, their contents are lost if there is a failure. However, the data source is still available, so the ETL process can simply be restarted if a failure occurs. diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md deleted file mode 100644 index 9daf521b..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-catalog.md +++ /dev/null @@ -1,202 +0,0 @@ -# WideWorldImporters Database Catalog - -The WideWorldImporters database contains all the transaction information and daily data for sales and purchases, as well as sensor data for vehicles and cold rooms. - -## Schemas - -WideWorldImporters uses schemas for different purposes, such as storing data, defining how users can access the data, and providing objects for data warehouse development and integration. - -### Data schemas - -These schemas contain the data. A number of tables are needed by all other schemas and are located in the Application schema. - -|Schema|Description| -|-----------------------------|---------------------| -|Application|Application-wide users, contacts, and parameters. This also contains reference tables with data that is used by multiple schemas| -|Purchasing|Stock item purchases from suppliers and details about suppliers.| -|Sales|Stock item sales to retail customers, and details about customers and sales people. | -|Warehouse|Stock item inventory and transactions.| - -### Secure-access schemas - -These schemas are used for external applications that are not allowed to access the data tables directly. They contain views and stored procedures used by external applications. - -|Schema|Description| -|-----------------------------|---------------------| -|Website|All access to the database from the company website is through this schema.| -|Reports|All access to the database from Reporting Services reports is through this schema.| -|PowerBI|All access to the database from the Power BI dashboards via the Enterprise Gateway is through this schema.| - -Note that the Reports and PowerBI schemas are not used in the initial release of the sample database. However, all Reporting Services and Power BI samples built on top of this database are encouraged to use these schemas. - -### Development schemas - -Special-purpose schemas - -|Schema|Description| -|-----------------------------|---------------------| -|Integration|Objects and procedures required for data warehouse integration (i.e. migrating the data to the WideWorldImportersDW database).| -|Sequences|Holds sequences used by all tables in the application.| - -## Tables - -All tables in the database are in the data schemas. - -### Application Schema - -Details of parameters and people (users and contacts), along with common reference tables (common to multiple other schemas). - -|Table|Description| -|-----------------------------|---------------------| -|SystemParameters|Contains system-wide configurable parameters.| -|People|Contains user names, contact information, for all who use the application, and for the people that the Wide World Importers deals with at customer organizations. This includes staff, customers, suppliers, and any other contacts. For people who have been granted permission to use the system or website, the information includes login details.| -|Cities|There are many addresses stored in the system, for people, customer organization delivery addresses, pickup addresses at suppliers, etc. Whenever an address is stored, there is a reference to a city in this table. There is also a spatial location for each city.| -|StateProvinces|Cities are part of states or provinces. This table has details of those, including spatial data describing the boundaries each state or province.| -|Countries|States or Provinces are part of countries. This table has details of those, including spatial data describing the boundaries of each country.| -|DeliveryMethods|Choices for delivering stock items (e.g., truck/van, post, pickup, courier, etc.)| -|PaymentMethods|Choices for making payments (e.g., cash, check, EFT, etc.)| -|TransactionTypes|Types of customer, supplier, or stock transactions (e.g., invoice, credit note, etc.)| - -### Purchasing Schema - -Details of suppliers and of stock item purchases. - -|Table|Description| -|-----------------------------|---------------------| -|Suppliers|Main entity table for suppliers (organizations)| -|SupplierCategories|Categories for suppliers (e.g., novelties, toys, clothing, packaging, etc.)| -|SupplierTransactions|All financial transactions that are supplier-related (invoices, payments)| -|PurchaseOrders|Details of supplier purchase orders| -|PurchaseOrderLines|Detail lines from supplier purchase orders| - -  -### Sales Schema - -Details of customers, salespeople, and of stock item sales. - -|Table|Description| -|-----------------------------|---------------------| -|Customers|Main entity tables for customers (organizations or individuals)| -|CustomerCategories|Categories for customers (ie novelty stores, supermarkets, etc.)| -|BuyingGroups|Customer organizations can be part of groups that exert greater buying power| -|CustomerTransactions|All financial transactions that are customer-related (invoices, payments)| -|SpecialDeals|Special pricing. This can include fixed prices, discount in dollars or discount percent.| -|Orders|Detail of customer orders| -|OrderLines|Detail lines from customer orders| -|Invoices|Details of customer invoices| -|InvoiceLines|Detail lines from customer invoices| - -### Warehouse Schema - -Details of stock items, their holdings and transactions. - -|Table|Description| -|-----------------------------|---------------------| -|StockItems|Main entity table for stock items| -|StockItemHoldings|Non-temporal columns for stock items. These arefrequently updated columns.| -|StockGroups|Groups for categorizing stock items (e.g., novelties, toys, edible novelties, etc.)| -|StockItemStockGroups|Which stock items are in which stock groups (many to many)| -|Colors|Stock items can (optionally) have colors| -|PackageTypes|Ways that stock items can be packaged (e.g., box, carton, pallet, kg, etc.| -|StockItemTransactions|Transactions covering all movements of all stock items (receipt, sale, write-off)| -|VehicleTemperatures|Regularly recorded temperatures of vehicle chillers| -|ColdRoomTemperatures|Regularly recorded temperatures of cold room chillers| - - -## Design considerations - -Database design is subjective and there is no right or wrong way to design a database. The schemas and tables in this database show ideas for how you can design your own database. - -### Schema design - -WideWorldImporters uses a small number of schemas so that it is easy to understand the database system and demonstrate database principles. - -Wherever possible, the database collocates tables that are commonly queried together into the same schema to minimize join complexity. - -The database schema has been code-generated based on a series of metadata tables in another database WWI_Preparation. This gives WideWorldImporters a very high degree of design consistency, naming consistency, and completeness. For details on how the schema has been generated see the source code: [wide-world-importers/wwi-database-scripts](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers/wwi-database-scripts) - -### Table design - -- All tables have single column primary keys for join simplicity. -- All schemas, tables, columns, indexes, and check constraints have a Description extended property that can be used to identify the purpose of the object or column. Memory-optimized tables are an exception to this since they don’t currently support extended properties. -- All foreign keys are automatically indexed unless there is another non-clustered index that has the same left-hand component. -- Auto-numbering in tables is based on sequences. These sequences are easier to work with across linked servers and similar environments than IDENTITY columns. Memory-optimized tables use IDENTITY columns since they don’t support in SQL Server 2016. -- A single sequence (TransactionID) is used for these tables: CustomerTransactions, SupplierTransactions, and StockItemTransactions. This demonstrates how a set of tables can have a single sequence. -- Some columns have appropriate default values. - -### Security schemas - -For security, WideWorldImporters does not allow external applications to access data schemas directly. To isolate access, WideWorldImporters uses security-access schemas that do not hold data, but contain views and stored procedures. External applications use the security schemas to retrieve the data that they are allowed to view. This way, users can only run the views and stored procedures in the secure-access schemas - -For example, this sample includes Power BI dashboards. An external application accesses these Power BI dashboards from the Power BI gateway as a user that has read-only permission on the PowerBI schema. For read-only permission, the user only needs SELECT and EXECUTE permission on the PowerBI schema. A database administrator at WWI assigns these permissions as needed. - -## Stored Procedures - -Stored procedures are organized in schemas. Most of the schemas are used for configuration or sample purposes. - -The `Website` schema contains the stored procedures that can be used by a Web front-end. - -The `Reports` and `PowerBI` schemas are meant for reporting services and PowerBI purposes. Any extensions of the sample are encouraged to use these schemas for reporting purposes. - -### Website schema - -These are the procedures used by a client application, such as a Web front-end. - -|Procedure|Purpose| -|-----------------------------|---------------------| -|ActivateWebsiteLogon|Allows a person (from `Application.People`) to have access to the website.| -|ChangePassword|Changes a user’s password (for users that are not using external authentication mechanisms).| -|InsertCustomerOrders|Allows inserting one or more customer orders (including the order lines).| -|InvoiceCustomerOrders|Takes a list of orders to be invoiced and processes the invoices.| -|RecordColdRoomTemperatures|Takes a sensor data list, as a table-valued parameter (TVP), and applies the data to the `Warehouse.ColdRoomTemperatures` temporal table.| -|RecordVehicleTemperature|Takes a JSON array and uses it to update `Warehouse.VehicleTemperatures`.| -|SearchForCustomers|Searches for customers by name or part of name (either the company name or the person name).| -|SearchForPeople|Searches for people by name or part of name.| -|SearchForStockItems|Searches for stock items by name or part of name or marketing comments.| -|SearchForStockItemsByTags|Searches for stock items by tags.| -|SearchForSuppliers|Searches for suppliers by name or part of name (either the company name or the person name).| - -### Integration Schema - -The stored procedures in this schema are used by the ETL process. They obtain the data needed from various tables for the timeframe required by the [ETL package](wwi-etl.md). - -### DataLoadSimulation Schema - -Simulates a workload that inserts sales and purchases. The main stored procedure is `PopulateDataToCurrentDate`, which is used to insert sample data up to the current date. - -|Procedure|Purpose| -|-----------------------------|---------------------| -|Configuration_ApplyDataLoadSimulationProcedures|Recreates the procedures needed for data load simulation. This is needed for bringing data up to the current date.| -|Configuration_RemoveDataLoadSimulationProcedures|This removes the procedures again after data simulation is complete.| -|DeactiveTemporalTablesBeforeDataLoad|Removes the temporal nature of all temporal tables and where applicable, applies a trigger so that changes can be made as though they were being applied at an earlier date than the sys-temporal tables allow.| -|PopulateDataToCurrentDate|Used to bring the data up to the current date. Should be run before any other configuration options after restoring the database from an initial backup.| -|ReactivateTemporalTablesAfterDataLoad|Re-establishes the temporal tables, including checking for data consistency. (Removes the associated triggers).| - - -### Application Schema - -These procedures are used to configure the sample. They are used to apply enterprise edition features to the standard edition version of the sample, and also to add auditing and full-text indexing. - -|Procedure|Purpose| -|-----------------------------|---------------------| -|AddRoleMemberIfNonexistant|Adds a member to a role if the member isn’t already in the role| -|Configuration_ApplyAuditing|Adds auditing. Server auditing is applied for standard edition databases; additional database auditing is added for enterprise edition.| -|Configuration_ApplyColumnstoreIndexing|Applies columnstore indexing to `Sales.OrderLines` and `Sales.InvoiceLines` and reindexes appropriately.| -|Configuration_ApplyFullTextIndexing|Applies fulltext indexes to `Application.People`, `Sales.Customers`, `Purchasing.Suppliers`, and `Warehouse.StockItems`. Replaces `Website.SearchForPeople`, `Website.SearchForSuppliers`, `Website.SearchForCustomers`, `Website.SearchForStockItems`, `Website.SearchForStockItemsByTags` with replacement procedures that use fulltext indexing.| -|Configuration_ApplyPartitioning|Applies table partitioning to `Sales.CustomerTransactions and `Purchasing.SupplierTransactions`, and rearranges the indexes to suit.| -|Configuration_ApplyRowLevelSecurity|Applies row level security to filter customers by sales territory related roles.| -|Configuration_ConfigureForEnterpriseEdition|Applies columnstore indexing, full text, in-memory, polybase, and partitioning.| -|Configuration_EnableInMemory|Adds a memory-optimized filegroup (when not working in Azure), replaces `Warehouse.ColdRoomTemperatures`, `Warehouse.VehicleTemperatures` with in-memory equivalents, and migrates the data, recreates the `Website.OrderIDList`, `Website.OrderList`, `Website.OrderLineList`, `Website.SensorDataList` table types with memory-optimized equivalents, drops and recreates the procedures `Website.InvoiceCustomerOrders`, `Website.InsertCustomerOrders`, and `Website.RecordColdRoomTemperatures` that uses these table types.| -|Configuration_RemoveAuditing|Removes the auditing configuration.| -|Configuration_RemoveRowLevelSecurity|Removes the row level security configuration (this is needed for changes to the associated tables).| -|CreateRoleIfNonExistant|Creates a database role if it doesn’t already exist.| - - -### Sequences Schema - -Procedures to configure the sequences in the database. - -|Procedure|Purpose| -|-----------------------------|---------------------| -|ReseedAllSequences|Calls the procedure ReseedSequenceBeyondTableValue for all sequences.| -|ReseedSequenceBeyondTableValue|Used to reposition the next sequence value beyond the value in any table that uses the same sequence. (Like a DBCC CHECKIDENT for identity columns equivalent for sequences but across potentially multiple tables).| diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md deleted file mode 100644 index 68671f52..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-installation.md +++ /dev/null @@ -1,63 +0,0 @@ -# WideWorldImporters Installation and Configuration - -## Prerequisites - -- [SQL Server 2016](https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016) (or higher) or [Azure SQL Database](https://azure.microsoft.com/services/sql-database/). To use the Full version of the sample, use SQL Server Evaluation/Developer/Enterprise Edition. -- [SQL Server Management Studio](https://msdn.microsoft.com/library/mt238290.aspx). For the best results use the April 2016 preview or later. - -## Download - -The latest release of the sample: - -[wide-world-importers-release](http://go.microsoft.com/fwlink/?LinkID=800630) - -Download the sample WideWorldImporters database backup/bacpac that corresponds to your edition of SQL Server or Azure SQL Database. - -Source code to recreate the sample database is available from the following location. Note that recreating the sample will result in slight differences in the data, since there is a random factor in the data generation: - -[wide-world-importers](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers/wwi-database-scripts) - -## Install - - -### SQL Server - -To restore a backup to a SQL Server instance, you can use Management Studio. - -1. Open SQL Server Management Studio and connect to the target SQL Server instance. -2. Right-click on the **Databases** node, and select **Restore Database**. -3. Select **Device** and click on the button **...** -4. In the dialog **Select backup devices**, click **Add**, navigate to the database backup in the filesystem of the server, and select the backup. Click **OK**. -5. If needed, change the target location for the data and log files, in the **Files** pane. Note that it is best practice to place data and log files on different drives. -6. Click **OK**. This will initiate the database restore. After it completes, you will have the database WideWorldImporters installed on your SQL Server instance. - -### Azure SQL Database - -To import a bacpac into a new SQL Database, you can use Management Studio. - -1. (optional) If you do not yet have a SQL Server in Azure, navigate to the [Azure portal](https://portal.azure.com/) and create a new SQL Database. In the process of create a database, you will create a server. Make note of the server. - - See [this tutorial](https://azure.microsoft.com/documentation/articles/sql-database-get-started/) to create a database in minutes -2. Open SQL Server Management Studio and connect to your server in Azure. -3. Right-click on the **Databases** node, and select **Import Data-Tier Application**. -4. In the **Import Settings** select **Import from local disk** and select the bacpac of the sample database from your file system. -5. Under **Database Settings** change the database name to *WideWorldImporters* and select the target edition and service objective to use. -6. Click **Next** and **Finish** to kick off deployment. It will take a few minutes to complete. When specifying a service objective lower than S2 it may take longer. - -## Configuration - -### Full-Text Indexing - -The sample database can make use of Full-Text Indexing. However, that feature is not installed by default with SQL Server - you need to select it during SQL Server setup (it is enabled by default in Azure SQL DB). Therefore, a post-installation step is required. - -1. In SQL Server Management Studio, connect to the WideWorldImporters database and open a new query window. -2. Run the following T-SQL command to enable the use of Full-Text Indexing in the database: - - EXECUTE Application.Configuration_ApplyFullTextIndexing - -### SQL Server Audit - -Enabling auditing in SQL Server requires server configuration. To enable SQL Server audit for the WideWorldImporters sample, run the following statement in the database: - - EXECUTE [Application].[Configuration_ApplyAuditing] - -In Azure SQL Database, Audit is configured through the [Azure portal](https://portal.azure.com/). diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sample-queries.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sample-queries.md deleted file mode 100644 index 9a08faf0..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sample-queries.md +++ /dev/null @@ -1,5 +0,0 @@ -# WideWorldImporters Sample Queries - -Refer to the sample-scripts.zip file that is included with the release of the sample, or refer to the source code: - -[wide-world-importers/sample-scripts](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/wide-world-importers/sample-scripts) diff --git a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md b/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md deleted file mode 100644 index 9e4ad1e8..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-oltp-htap-sql-features.md +++ /dev/null @@ -1,27 +0,0 @@ -# WideWorldImporters Use of SQL Server Features and Capabilities - -WideWorldImporters is designed to showcase many of the key features of SQL Server, including the latest features introduced in SQL Server 2016. The following is a list of SQL Server features and capabilities, and a description of how they are used in WideWorldImporters. - -|SQL Server feature or capability|Use in WideWorldImporters| -|-----------------------------|---------------------| -|Temporal tables|There are many temporal tables, including all look-up style reference tables and main entities such as StockItems, Customers, and Suppliers. Using temporal tables allows to conveniently keep track of the history of these entities.| -|AJAX calls for JSON|The application frequently uses AJAX calls to query these tables: Persons, Customers, Suppliers, and StockItems. The calls return JSON payloads (i.e. the data that is returned is formatted as JSON data). See, for example, the stored procedure `Website.SearchForCustomers`.| -|JSON property/value bags|A number of tables have columns that hold JSON data to extend the relational data in the table. For example, `Application.SystemParameters` has a column for application settings and `Application.People` has a column to record user preferences. These tables use an `nvarchar(max)` column to record the JSON data, along with a CHECK constraint using the built-in function `ISJSON` to ensure the column values are valid JSON.| -|Row-level security (RLS)|Row Level Security (RLS) is used to limit access to the Customers table, based on role membership. Each sales territory has a role and a user. To see this in action, use the corresponding script in sample-script.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).| -|Real-time Operational Analytics|(Full version of the database) The core transactional tables `Sales.InvoiceLines` and `Sales.OrderLines` both have a non-clustered columnstore index to support efficient execution of analytical queries in the transactional database with minimal impact on the operational workload. Running transactions and analytics in the same database is also referred to as [Hybrid Transactional/Analytical Processing (HTAP)](https://wikipedia.org/wiki/Hybrid_Transactional/Analytical_Processing_(HTAP)). To see this in action, use the corresponding script in sample-script.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).| -|PolyBase|To see this PolyBase in action, using an external table with a public data set hosted in Azure blog storage, use the corresponding script in sample-script.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).| -|In-Memory OLTP|(Full version of the database) The table types are all memory-optimized, such that table-valued parameters (TVPs) all benefit from memory-optimization.

The two monitoring tables, `Warehouse.VehicleTemperatures` and `Warehouse.ColdRoomTemperatures`, are memory-optimized. This allows the ColdRoomTemperatures table to be populated at higher speed than a traditional disk-based table. The VehicleTemperatures table holds the JSON payload and lends itself to extension towards IoT scenarios. The VehicleTemperatures table further lends itself to scenarios involving EventHubs, Stream Analytics, and Power BI.

The stored procedure `Website.RecordColdRoomTemperatures` is natively compiled to further improve the performance of recording cold room temperatures.

To see an example of In-Memory OLTP in action, see the vehicle-locations workload driver in workload-drivers.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).| -|Clustered columnstore index|(Full version of the database) The table `Warehouse.StockItemTransactions` uses a clustered columnstore index. The number of rows in this table is expected to grow large, and the clustered columnstore index significantly reduces the on-disk size of the table, and improves query performance. The modification on this table are insert-only - there is no update/delete on this table in the online workload - and clustered columnstore index performs well for insert workloads.| -|Dynamic Data Masking|In the database schema, Data Masking has been applied to the bank details held for Suppliers, in the table `Purchasing.Suppliers`. Non-admin staff will not have access to this information.| -|Always Encrypted|A demo for Always Encrypted is included in the downloadable samples.zip, which is part of the [release of the sample](http://go.microsoft.com/fwlink/?LinkID=800630).. The demo creates an encryption key, a table using encryption for sensitive data, and a small sample application that inserts data into the table.| -|Stretch database|The `Warehouse.ColdRoomTemperatures` table has been implemented as a temporal table, and is memory-optimized in the Full version of the sample database. The archive table is disk-based and can be stretched to Azure.| -|Full-text indexes|Full-text indexes improve searches for People, Customers, and StockItems. The indexes are applied to queries only if you have full-text indexing installed on your SQL Server instance. A non-persistent computed column is used to create the data that is full-text indexed in the StockItems table.

`CONCAT` is used for concatenating the fields to create SearchData that is full-text indexed.
To enable the use of full-text indexes in the sample execute the following statement in the database:

`EXECUTE [Application].[Configuration_ConfigureFullTextIndexing]`

The procedure creates a default fulltext catalog if one doesn’t already exist, then replaces the search views with full-text versions of those views).

Note that using full-text indexes in SQL Server requires selecting the Full-Text option during installation. Azure SQL Database does not require and specific configuration to enable full-text indexes.| -|Indexed persisted computed columns|Indexed persisted computed columns used in SupplierTransactions and CustomerTransactions.| -|Check constraints|A relatively complex check constraint is in `Sales.SpecialDeals`. This ensures that one and only one of DiscountAmount, DiscountPercentage, and UnitPrice is configured.| -|Unique constraints|A many to many construction (and unique constraints) are set up for Warehouse.StockItemStockGroups`.| -|Table partitioning|(Full version of the database) The tables `Sales.CustomerTransactions` and `Purchasing.SupplierTransactions` are both partitioned by year using the partition function `PF_TransactionDate` and the partition scheme `PS_TransactionDate`. Partitioning is used to improve the manageability of large tables.| -|List processing|An example table type `Website.OrderIDList` is provided. It is used by an example procedure `Website.InvoiceCustomerOrders`. The procedure uses Common Table Expressions (CTEs), TRY/CATCH, JSON_MODIFY, XACT_ABORT, NOCOUNT, THROW, and XACT_STATE to demonstrates the ability to process a list of orders rather than just a single order, to minimize round trips from the application to the database engine.| -|GZip compression|The `Warehouse.VehicleTemperature`s table holds full sensor data but when this data is more than a few months old, it is compressed to conserve space using the COMPRESS function, which uses GZip compression.

The view `Website.VehicleTemperatures` uses the DECOMPRESS function when retrieving data that was previously compressed.| -|Query Store|Query Store is enabled on the database. After running a few queries, open the database in Management Studio, open the node Query Store, which is under the database, and open the report Top Resource Consuming Queries to see the query executions and the plans for the queries you just ran.| -|STRING_SPLIT|The column `DeliveryInstructions` in the table `Sales.Invoices`has a comma-delimited value that can be used to demonstrate STRING_SPLIT.| -|Audit|SQL Server Audit can be enabled for this sample database by running the following statement in the database:

`EXECUTE [Application].[Configuration_ApplyAuditing]`

In Azure SQL Database, auditing is enabled through the [Azure portal](https://portal.azure.com/).

Security operations involving logins, roles and permissions are logged on all systems where audit is enabled (including standard edition systems). Audit is directed to the application log because this is available on all systems and does not require additional permissions. A warning is given that for higher security, it should be redirected to the security log or to a file in a secure folder. A link is provided to describe the required additional configuration.

For evaluation/developer/enterprise edition systems, access to all financial transactional data is audited.| diff --git a/samples/databases/wide-world-importers/documentation/wwi-overview.md b/samples/databases/wide-world-importers/documentation/wwi-overview.md deleted file mode 100644 index 352b4c8a..00000000 --- a/samples/databases/wide-world-importers/documentation/wwi-overview.md +++ /dev/null @@ -1,49 +0,0 @@ -# Wide World Importers Overview - -This is an overview of the fictitious company Wide World Importers and the workflows that are addressed in the WideWorldImporters sample databases for SQL Server and Azure SQL Database. - -Wide World Importers (WWI) is a wholesale novelty goods importer and distributor operating from the San Francisco bay area. - -As a wholesaler, WWI’s customers are mostly companies who resell to individuals. WWI sells to retail customers across the United States including specialty stores, supermarkets, computing stores, tourist attraction shops, and some individuals. WWI also sells to other wholesalers via a network of agents who promote the products on WWI’s behalf. While all of WWI’s customers are currently based in the United States, the company is intending to push for expansion into other countries. - -WWI buys goods from suppliers including novelty and toy manufacturers, and other novelty wholesalers. They stock the goods in their WWI warehouse and reorder from suppliers as needed to fulfil customer orders. They also purchase large volumes of packaging materials, and sell these in smaller quantities as a convenience for the customers. - -Recently WWI started to sell a variety of edible novelties such as chilly chocolates. The company previously did not have to handle chilled items. Now, to meet food handling requirements, they must monitor the temperature in their chiller room and any of their trucks that have chiller sections. - -## Workflow for warehouse stock items - -The typical flow for how items are stocked and distributed is as follows: -- WWI creates purchase orders and submits the orders to the suppliers. -- Suppliers send the items, WWI receives them and stocks them in their warehouse. -- Customers order items from WWI -- WWI fills the customer order with stock items in the warehouse, and when they do not have sufficient stock, they order the additional stock from the suppliers. -- Some customers do not want to wait for items that are not in stock. If they order say five different stock items, and four are available, they want to receive the four items and backorder the remaining item. The item would them be sent later in a separate shipment. -- WWI invoices customers for the stock items, typically by converting the order to an invoice. -- Customers might order items that are not in stock. These items are backordered. -- WWI delivers stock items to customers either via their own delivery vans, or via other couriers or freight methods. -- Customers pay invoices to WWI. -- Periodically, WWI pays suppliers for items that were on purchase orders. This is often sometime after they have received the goods. - -## Data Warehouse and analysis workflow - -While the team at WWI use SQL Server Reporting Services to generate operational reports from the WideWorldImporters database, they also need to perform analytics on their data and need to generate strategic reports. The team have created a dimensional data model in a database WideWorldImportersDW. This database is populated by an Integration Services package. - -SQL Server Analysis Services is used to create analytic data models from the data in the dimensional data model. SQL Server Reporting Services is used to generate strategic reports directly from the dimensional data model, and also from the analytic model. Power BI is used to create dashboards from the same data. The dashboards are used on websites, and on phones and tablets. *Note: these data models and reports are not yet available* - -## Additional workflows - -These are additional workflows. -- WWI issues credit notes when a customer does not receive the good for some reason, or when the goods are faulty. These are treated as negative invoices. -- WWI periodically counts the on-hand quantities of stock items to ensure that the stock quantities shown as available on their system are accurate. (The process of doing this is called a stocktake). -- Cold room temperatures. Perishable goods are stored in refrigerated rooms. Sensor data from these rooms is ingested into the database for monitoring and analytics purposes. -- Vehicle location tracking. Vehicles that transport goods for WWI include sensors that track the location. This location is again ingested into the database for monitoring and further analytics. - -## Fiscal year - -The company operates with a financial year that starts on November 1st. - -## Terms of use - -The license for the sample database and the sample code is described here: [license.txt](https://github.com/Microsoft/sql-server-samples/blob/master/license.txt) - -The sample database includes public data that has been loaded from data.gov and Natural EarthData. The terms of use are here: [http://www.naturalearthdata.com/about/terms-of-use/](http://www.naturalearthdata.com/about/terms-of-use/) From b272a0fa35b1da6e0b89b7b15669c686d4af9887 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 8 Jun 2016 08:57:55 -0700 Subject: [PATCH 52/73] fixes for Azure DB --- .gitignore | 3 ++- .../4-wwi-configure-required-database-objects.sql | 13 +++++++------ ...4-wwi-dw-configure-required-database-objects.sql | 13 +++++++------ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index d7086766..fcee0a89 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Release/DemoWork samples/features/in-memory/ticket-reservations/DemoWorkload/bin/Release/DemoWorkload.vshost.exe.config samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe.config -*.zip \ No newline at end of file +*.zip +samples/features/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/CreatePackageFile.bat \ No newline at end of file diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql index f4aaea52..bb1387e5 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql @@ -3922,24 +3922,25 @@ BEGIN IF NOT EXISTS (SELECT 1 FROM sys.filegroups WHERE name = N'WWI_InMemory_Data') BEGIN SET @SQL = N' -ALTER DATABASE WideWorldImporters +ALTER DATABASE CURRENT ADD FILEGROUP WWI_InMemory_Data CONTAINS MEMORY_OPTIMIZED_DATA;'; EXECUTE (@SQL); SET @SQL = N' -ALTER DATABASE WideWorldImporters +ALTER DATABASE CURRENT ADD FILE (name = N''WWI_InMemory_Data_1'', filename = ''' + @MemoryOptimizedFilegroupFolder + N''') TO FILEGROUP WWI_InMemory_Data;'; EXECUTE (@SQL); - SET @SQL = N' -ALTER DATABASE WideWorldImporters -SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;'; - EXECUTE (@SQL); END; END; + SET @SQL = N' +ALTER DATABASE CURRENT +SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;'; + EXECUTE (@SQL); + IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = N'ColdRoomTemperatures' AND is_memory_optimized <> 0) BEGIN diff --git a/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql index 8c8c0582..e6a8c637 100644 --- a/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql @@ -1148,24 +1148,25 @@ BEGIN IF NOT EXISTS (SELECT 1 FROM sys.filegroups WHERE name = N'WWIDW_InMemory_Data') BEGIN SET @SQL = N' -ALTER DATABASE WideWorldImportersDW +ALTER DATABASE CURRENT ADD FILEGROUP WWIDW_InMemory_Data CONTAINS MEMORY_OPTIMIZED_DATA;'; EXECUTE (@SQL); SET @SQL = N' -ALTER DATABASE WideWorldImportersDW +ALTER DATABASE CURRENT ADD FILE (name = N''WWIDW_InMemory_Data_1'', filename = ''' + @MemoryOptimizedFilegroupFolder + N''') TO FILEGROUP WWIDW_InMemory_Data;'; EXECUTE (@SQL); - SET @SQL = N' -ALTER DATABASE WideWorldImportersDW -SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;'; - EXECUTE (@SQL); END; END; + SET @SQL = N' +ALTER DATABASE CURRENT +SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;'; + EXECUTE (@SQL); + IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = N'Customer_Staging' AND is_memory_optimized <> 0) BEGIN From 6f666364688483a1667fbd5ddfd2f7677bd5225a Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 8 Jun 2016 09:59:14 -0700 Subject: [PATCH 53/73] fix for Azure --- .gitignore | 3 ++- .../4-wwi-configure-required-database-objects.sql | 14 +++++--------- ...-wwi-dw-configure-required-database-objects.sql | 1 - 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index fcee0a89..931773c9 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ samples/features/in-memory/ticket-reservations/DemoWorkload/bin/Release/DemoWork samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe.config *.zip -samples/features/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/CreatePackageFile.bat \ No newline at end of file +samples/features/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/CreatePackageFile.bat +samples/features/in-memory/ticket-reservations/TicketReservations/TicketReservations.dbmdl \ No newline at end of file diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql index bb1387e5..1e2ef172 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/4-wwi-configure-required-database-objects.sql @@ -3900,7 +3900,6 @@ DROP PROCEDURE IF EXISTS [Application].Configuration_EnableInMemory; GO CREATE PROCEDURE [Application].Configuration_EnableInMemory -WITH EXECUTE AS OWNER AS BEGIN SET NOCOUNT ON; @@ -4999,10 +4998,7 @@ BEGIN EXEC [Application].[Configuration_ApplyColumnstoreIndexing]; - IF SERVERPROPERTY(N'IsFullTextInstalled') = 0 - BEGIN - EXEC [Application].[Configuration_ApplyFullTextIndexing]; - END; + EXEC [Application].[Configuration_ApplyFullTextIndexing]; EXEC [Application].[Configuration_EnableInMemory]; @@ -6161,8 +6157,8 @@ GO -- initial data population to ship date -EXEC WideWorldImporters.DataLoadSimulation.Configuration_ApplyDataLoadSimulationProcedures; -EXEC WideWorldImporters.DataLoadSimulation.DailyProcessToCreateHistory +EXEC DataLoadSimulation.Configuration_ApplyDataLoadSimulationProcedures; +EXEC DataLoadSimulation.DailyProcessToCreateHistory @StartDate = '20130101', @EndDate = '20160331', @AverageNumberOfCustomerOrdersPerDay = 60, @@ -6171,11 +6167,11 @@ EXEC WideWorldImporters.DataLoadSimulation.DailyProcessToCreateHistory @UpdateCustomFields = 1, @IsSilentMode = 1, @AreDatesPrinted = 1; -EXEC WideWorldImporters.DataLoadSimulation.Configuration_RemoveDataLoadSimulationProcedures; +EXEC DataLoadSimulation.Configuration_RemoveDataLoadSimulationProcedures; -- roll data up to current date -EXEC WideWorldImporters.DataLoadSimulation.PopulateDataToCurrentDate +EXEC DataLoadSimulation.PopulateDataToCurrentDate @AverageNumberOfCustomerOrdersPerDay = 60, @SaturdayPercentageOfNormalWorkDay = 50, @SundayPercentageOfNormalWorkDay = 0, diff --git a/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql b/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql index e6a8c637..ac7b8d09 100644 --- a/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql +++ b/samples/databases/wide-world-importers/wwi-dw-database-scripts/4-wwi-dw-configure-required-database-objects.sql @@ -1124,7 +1124,6 @@ DROP PROCEDURE IF EXISTS [Application].Configuration_EnableInMemory; GO CREATE PROCEDURE [Application].Configuration_EnableInMemory -WITH EXECUTE AS OWNER AS BEGIN SET NOCOUNT ON; From 9578f98183880f56325b808afd7127baa5448b46 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 8 Jun 2016 10:52:34 -0700 Subject: [PATCH 54/73] Update README.md --- samples/databases/wide-world-importers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/README.md b/samples/databases/wide-world-importers/README.md index a29693b2..c33755e8 100644 --- a/samples/databases/wide-world-importers/README.md +++ b/samples/databases/wide-world-importers/README.md @@ -43,7 +43,7 @@ To run this sample, you need the following prerequisites. 1. SQL Server 2016 (or higher) or an Azure SQL Database. -2. SQL Server Management Studio, preferably 2016 April Preview or later (version >= 13.0.14000.36). +2. SQL Server Management Studio, preferably June 2016 release or later (version >= 13.0.15000.23). 3. (to build sample apps) Visual Studio 2015. 4. (to run ETL jobs) SQL Server 2016 Integration Services From acc71d0e27c4eff4bde792873560b071ee80d7e3 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 8 Jun 2016 10:53:14 -0700 Subject: [PATCH 55/73] Update README.md --- samples/databases/wide-world-importers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/README.md b/samples/databases/wide-world-importers/README.md index c33755e8..e7b3de9e 100644 --- a/samples/databases/wide-world-importers/README.md +++ b/samples/databases/wide-world-importers/README.md @@ -8,7 +8,7 @@ The sample includes the databases that can be explored, as well as sample applic **Latest release**: [wide-world-importers-release](http://go.microsoft.com/fwlink/?LinkID=800630) -**Documentation**: [root.md](http://go.microsoft.com/fwlink/?LinkID=800631) +**Documentation**: [Wide World Importers Documentation](http://go.microsoft.com/fwlink/?LinkID=800631) **Feedback on the sample**: send to [sqlserversamples@microsoft.com](mailto:sqlserversamples@microsoft.com) From c572a40475cfad0c50fa605cec1dd380c1f39848 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 8 Jun 2016 10:53:58 -0700 Subject: [PATCH 56/73] Update README.md --- .../wide-world-importers/wwi-dw-database-scripts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md b/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md index f4022656..fe47f76c 100644 --- a/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md +++ b/samples/databases/wide-world-importers/wwi-dw-database-scripts/README.md @@ -35,7 +35,7 @@ To run this sample, you need the following prerequisites. 1. SQL Server 2016 (or higher) or an Azure SQL Database. -2. SQL Server Management Studio, preferably 2016 April Preview or later (version >= 13.0.14000.36) +2. SQL Server Management Studio, preferably June 2016 release or later (version >= 13.0.15000.23) From 53f134ed412268d8ef1c5033069efd0e94a3a6db Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Wed, 8 Jun 2016 16:20:03 -0700 Subject: [PATCH 57/73] Update README.md clarification under #6 --- .../wide-world-importers/wwi-database-scripts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/README.md b/samples/databases/wide-world-importers/wwi-database-scripts/README.md index c70bf3ca..a9c77117 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/README.md +++ b/samples/databases/wide-world-importers/wwi-database-scripts/README.md @@ -59,7 +59,7 @@ Note that each time the databases are reconstructed from empty, they will contai 5. Execute the script **5-wwi-load-seed-data.sql**. This script populates the seed data required for the database. It will typically take a few minutes to execute. 6. Execute the script **6-wwi-data-simulation.sql**. This script runs data simulation to populate the transaction tables. It can take 20-30 minutes to execute. -

The statements in this script remove the temporal nature of the tables, and implements a series of triggers. They then emulate typical activities that would occur during each day. Finally, they remove the triggers and re-establishes the temporal tables. You can see the progress of the simulation in the Messages tab in SSMS as the query executes. (IsSilentMode = 1 produces just date output if AreDatesPrinted = 1. When 0, it produces much more detailed output about each task being undertaken). +

The statements in this script remove the temporal nature of the tables, and implements a series of triggers. They then emulate typical activities that would occur during each day. Finally, they remove the triggers and re-establishes the temporal tables. You can see the progress of the simulation in the Messages tab in SSMS as the query executes. (AreDatesPrinted controls whether dates are printed to the messages window as data is generated. IsSilentMode controls whether detailed output is printed. IsSilentMode = 1 produces just date output if AreDatesPrinted = 1.). Note that a different outcome is produced each time it is run as it uses many random values. StartDate and EndDate cover the period for generation. Other code populates the 2012 period when expanding the columnstore tables so do not populate back into 2012 or earlier with this procedure. The EndDate must also be at or before the current date as temporal tables do not allow future dates. You can configure the amount of data produced by modifying the number of orders per day. The default is 60 orders and produces a reasonable OLTP database size of around 93MB compressed. You are also able to configure how busy Saturday and Sunday are compared to normal Monday to Friday working days, as a percentage. The suggested values are 50% for Saturday and 0% for Sunday. From 4b4b1ab7bda65e959fcc61465575f834410be6eb Mon Sep 17 00:00:00 2001 From: Perry Skountrianos Date: Thu, 9 Jun 2016 09:53:54 -0700 Subject: [PATCH 58/73] {Initial Commit} Adding Windows Containers Sample folder --- samples/manage/README.md | 10 +-- .../dockerfile | 30 +++++++++ .../readme.md | 67 +++++++++++++++++++ samples/manage/windows-containers/readme.md | 3 + 4 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 samples/manage/windows-containers/mssql-server-2014-express-windows/dockerfile create mode 100644 samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md create mode 100644 samples/manage/windows-containers/readme.md diff --git a/samples/manage/README.md b/samples/manage/README.md index 4e5d5265..db99eedb 100644 --- a/samples/manage/README.md +++ b/samples/manage/README.md @@ -2,16 +2,16 @@ Contains samples for managing Microsoft's SQL databases including SQL Server, Azure SQL Database, and Azure SQL Data Warehouse. -Samples are coming soon! - - ## Collect and monitor resource usage data across multiple pools in a subscription -This Solution Quick Start provides a solution for collecting and monitoring Azure SQL Database resource usage accross multiple pools in a subscription. When you have a large number of databases in a subscription, it is cumbersome to monitor each elastic pool separately. To solve this, you can combine SQL database PowerShell cmdlets and T-SQL queries to collect resource usage data from multiple pools and their databases for monitoring and analysis of resource usage. +This Solution Quick Start provides a solution for collecting and monitoring Azure SQL Database resource usage across multiple pools in a subscription. When you have a large number of databases in a subscription, it is cumbersome to monitor each elastic pool separately. To solve this, you can combine SQL database PowerShell cmdlets and T-SQL queries to collect resource usage data from multiple pools and their databases for monitoring and analysis of resource usage. [Manage Mulitiple Elastic Pools in SQL Database Using PowerShell and Power BI](https://github.com/Microsoft/sql-server-samples/tree/master/samples/manage/azure-sql-db-elastic-pools) in the GitHub SQL Server samples repository provides a set of powershell scripts and T-SQL queries along with documentation on what it does and how to use it. ## Get started using Elastic Pools in a SaaS scenario - This Solution Quick Start provides a solution for a Softwware-as-a-Solution (SaaS) scenario that leverages Elastic Pools to provide a cost-effective, scalable database back-end of a SaaS application. In this solution, you will walk-though the implementation of a web app that lets you visualize the load created on an Elastic Pool by a load generator using a custom dashboard that supplements the Azure Portal. [saas-scenario-with-elastic-pools](https://github.com/Microsoft/sql-server-samples/tree/master/samples/manage/azure-sql-db-elastic-pools-custom-dashboard) in the GitHub SQL Server samples repository provides a load generator and monitoring web app along with the documentation on what it does and how to use it. + +## Windows Containers +This includes samples for setting up mssql-server in Windows Containers. Currently it includes the following: +- __[windows-containers] (windows-containers /)__ diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/dockerfile b/samples/manage/windows-containers/mssql-server-2014-express-windows/dockerfile new file mode 100644 index 00000000..df3f4849 --- /dev/null +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/dockerfile @@ -0,0 +1,30 @@ +# mssql server 2014 express image listening on static port 1433 +# +# Note: This dockerfile is based on Buc Rogers' work here: +# https://github.com/brogersyh/Dockerfiles-for-windows/tree/master/sqlexpress +# +# .NET 3.5 required for SQL Server +FROM microsoft/dotnet35 + +# maintainer for image metadata +MAINTAINER Perry Skountrianos + +# set environment variables +ENV SQL_EXPRESS_DOWNLOAD_URL "https://download.microsoft.com/download/1/5/6/156992E6-F7C7-4E55-833D-249BD2348138/ENU/x64/SQLEXPR_x64_ENU.exe" +ENV SQL_SERVER_SA_PASSWORD "Password1" + +# set working directory +WORKDIR / + +# download and install Microsoft SQL 2014 Express Edition in one step +RUN powershell -Command (New-Object System.Net.WebClient).DownloadFile('%SQL_EXPRESS_DOWNLOAD_URL%', 'sqlexpress.exe') && /sqlexpress.exe /qs /x:setup && /setup/setup.exe /q /ACTION=Install /INSTANCENAME=SQLEXPRESS /FEATURES=SQLEngine /UPDATEENABLED=0 /SECURITYMODE=SQL /SAPWD=%SQL_SERVER_SA_PASSWORD% /SQLSVCACCOUNT="NT AUTHORITY\System" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS && del /F /Q sqlexpress.exe && rd /q /s setup + +RUN powershell -Command \ + set-strictmode -version latest ; \ + stop-service MSSQL`$SQLEXPRESS ; \ + set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql12.SQLEXPRESS\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpdynamicports -value '' ; \ + set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql12.SQLEXPRESS\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpport -value 1433 ; \ + start-service MSSQL`$SQLEXPRESS + +CMD powershell -Command while ($true) { Start-Sleep -Seconds 3600 } +EXPOSE 1433 \ No newline at end of file diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md new file mode 100644 index 00000000..644fd46c --- /dev/null +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md @@ -0,0 +1,67 @@ +# IoT Smart Grid +The goal of this Dockerfile is to help developers get started using SQL Server 2014 Express in Windows Containers. The Dockerfile downloads and installs SQL Server 2014 Express with the default setup parameters that could be changed (if needed) after the image is installed. + +Note: This dockerfile is based on Buc Rogers' work that can be found [here] (https://github.com/brogersyh/Dockerfiles-for-windows/tree/master/sqlexpress) + +### Contents + +[About this sample](#about-this-sample)
+[Before you begin](#before-you-begin)
+[Run this sample](#run-this-sample)
+[Sample details](#sample-details)
+[Disclaimers](#disclaimers)
+[Related links](#related-links)
+ + + +## About this sample + +1. **Applies to:** SQL Server 2014 Express, Windows Server Technical Preview 4 or later +5. **Authors:** Perry Skountrianos [perrysk-msft] + + + +## Before you begin + +To run this sample, you need the following prerequisites. + +**Software prerequisites:** + +1. System running Windows Server Technical Preview 4 or later. +2. 10GB available storage for container host image, OS Base Image and setup scripts. +3. Administrator permissions on the system. + + + +## Run this sample +Use the Dockerfile and execute the following two commands to build and run sqlexpress: +1. docker build -t sqlexpress . +2. docker run -it -p 1433:1433 sqlexpress cmd + + + +## Sample details + +**High Level Description** +The Dockerfile downloads and installs SQL Server 2014 Express with the following default setup parameters that could be changed (if needed) after the image is installed. +- sa password: Password1 +- Collation: SQL_Latin1_General_CP1_CI_AS +- SQL Instance Name: SQLEXPRESS +- Root Directory: C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL +- Language: English (United Stated) + + + +## Disclaimers +The code included in this sample is not intended to be a set of best practices on how to build scalable enterprise grade applications. This is beyond the scope of this quick start sample. + + + +## Related Links + + +For more information, see these articles: +- [Windows Containers] (https://msdn.microsoft.com/en-us/virtualization/windowscontainers/about/about_overview) +- [Windows-based containers: Modern app development with enterprise-grade control] (https://www.youtube.com/watch?v=Ryx3o0rD5lY&feature=youtu.be) +- [Windows Containers: What, Why and How] (https://channel9.msdn.com/Events/Build/2015/2-704) +- [SQL Server in Windows Containers] (https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/03/21/sql-server-in-windows-containers/#comments) diff --git a/samples/manage/windows-containers/readme.md b/samples/manage/windows-containers/readme.md new file mode 100644 index 00000000..31df6106 --- /dev/null +++ b/samples/manage/windows-containers/readme.md @@ -0,0 +1,3 @@ +## Windows Containers +This includes samples for setting up mssql-server in Windows Containers. Currently it includes the following: +- __[mssql-server-2014-express-windows] (mssql-server-2014-express-windows /)__ From 64766ffe2f31fa190cee076d21ac5cb607f33481 Mon Sep 17 00:00:00 2001 From: Perry Skountrianos - MSFT Date: Thu, 9 Jun 2016 09:59:25 -0700 Subject: [PATCH 59/73] Update readme.md --- .../mssql-server-2014-express-windows/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md index 644fd46c..d03e3533 100644 --- a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md @@ -1,4 +1,4 @@ -# IoT Smart Grid +# mssql-server-2014-express-windows The goal of this Dockerfile is to help developers get started using SQL Server 2014 Express in Windows Containers. The Dockerfile downloads and installs SQL Server 2014 Express with the default setup parameters that could be changed (if needed) after the image is installed. Note: This dockerfile is based on Buc Rogers' work that can be found [here] (https://github.com/brogersyh/Dockerfiles-for-windows/tree/master/sqlexpress) From 4f7adbc0e6f2aa5e4c7d6b9d45ccca420e1a70ad Mon Sep 17 00:00:00 2001 From: Perry Skountrianos - MSFT Date: Thu, 9 Jun 2016 10:02:35 -0700 Subject: [PATCH 60/73] Update readme.md --- samples/manage/windows-containers/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/manage/windows-containers/readme.md b/samples/manage/windows-containers/readme.md index 31df6106..ee041df5 100644 --- a/samples/manage/windows-containers/readme.md +++ b/samples/manage/windows-containers/readme.md @@ -1,3 +1,3 @@ ## Windows Containers This includes samples for setting up mssql-server in Windows Containers. Currently it includes the following: -- __[mssql-server-2014-express-windows] (mssql-server-2014-express-windows /)__ +- __[mssql-server-2014-express-windows] (mssql-server-2014-express-windows/)__ From cb60c062a29c4fcdee9a84d8f470f0c7b690493b Mon Sep 17 00:00:00 2001 From: Perry Skountrianos - MSFT Date: Thu, 9 Jun 2016 10:03:03 -0700 Subject: [PATCH 61/73] Update README.md --- samples/manage/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/manage/README.md b/samples/manage/README.md index db99eedb..6a106762 100644 --- a/samples/manage/README.md +++ b/samples/manage/README.md @@ -14,4 +14,4 @@ This Solution Quick Start provides a solution for a Softwware-as-a-Solution (Saa ## Windows Containers This includes samples for setting up mssql-server in Windows Containers. Currently it includes the following: -- __[windows-containers] (windows-containers /)__ +- __[windows-containers] (windows-containers/)__ From 33586685d53ff6d464a216e0682ae60106186fd6 Mon Sep 17 00:00:00 2001 From: Perry Skountrianos Date: Fri, 10 Jun 2016 16:24:15 -0700 Subject: [PATCH 62/73] Updated DockerFile: User specified sa password --- .../dockerfile | 16 ++++++++-------- .../mssql-server-2014-express-windows/readme.md | 9 ++++----- .../mssql-server-2014-express-windows/start.ps1 | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 samples/manage/windows-containers/mssql-server-2014-express-windows/start.ps1 diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/dockerfile b/samples/manage/windows-containers/mssql-server-2014-express-windows/dockerfile index df3f4849..8bd3e52b 100644 --- a/samples/manage/windows-containers/mssql-server-2014-express-windows/dockerfile +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/dockerfile @@ -10,21 +10,21 @@ FROM microsoft/dotnet35 MAINTAINER Perry Skountrianos # set environment variables -ENV SQL_EXPRESS_DOWNLOAD_URL "https://download.microsoft.com/download/1/5/6/156992E6-F7C7-4E55-833D-249BD2348138/ENU/x64/SQLEXPR_x64_ENU.exe" -ENV SQL_SERVER_SA_PASSWORD "Password1" +ENV sql_express_download_url "https://download.microsoft.com/download/1/5/6/156992E6-F7C7-4E55-833D-249BD2348138/ENU/x64/SQLEXPR_x64_ENU.exe" +ENV sa_password _ -# set working directory +# make install files accessible +COPY . / WORKDIR / # download and install Microsoft SQL 2014 Express Edition in one step -RUN powershell -Command (New-Object System.Net.WebClient).DownloadFile('%SQL_EXPRESS_DOWNLOAD_URL%', 'sqlexpress.exe') && /sqlexpress.exe /qs /x:setup && /setup/setup.exe /q /ACTION=Install /INSTANCENAME=SQLEXPRESS /FEATURES=SQLEngine /UPDATEENABLED=0 /SECURITYMODE=SQL /SAPWD=%SQL_SERVER_SA_PASSWORD% /SQLSVCACCOUNT="NT AUTHORITY\System" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS && del /F /Q sqlexpress.exe && rd /q /s setup +RUN powershell -Command (New-Object System.Net.WebClient).DownloadFile('%sql_express_download_url%', 'sqlexpress.exe') && /sqlexpress.exe /qs /x:setup && /setup/setup.exe /q /ACTION=Install /INSTANCENAME=SQLEXPRESS /FEATURES=SQLEngine /UPDATEENABLED=0 /SQLSVCACCOUNT="NT AUTHORITY\System" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS && del /F /Q sqlexpress.exe && rd /q /s setup RUN powershell -Command \ set-strictmode -version latest ; \ - stop-service MSSQL`$SQLEXPRESS ; \ + stop-service MSSQL`$%sqlinstance% ; \ set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql12.SQLEXPRESS\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpdynamicports -value '' ; \ set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql12.SQLEXPRESS\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpport -value 1433 ; \ - start-service MSSQL`$SQLEXPRESS + set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql12.SQLEXPRESS\mssqlserver\' -name LoginMode -value 2 ; -CMD powershell -Command while ($true) { Start-Sleep -Seconds 3600 } -EXPOSE 1433 \ No newline at end of file +CMD powershell ./start %sa_password% \ No newline at end of file diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md index d03e3533..6e706da6 100644 --- a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md @@ -1,5 +1,5 @@ -# mssql-server-2014-express-windows -The goal of this Dockerfile is to help developers get started using SQL Server 2014 Express in Windows Containers. The Dockerfile downloads and installs SQL Server 2014 Express with the default setup parameters that could be changed (if needed) after the image is installed. +# mssql-server-2014-express-windows +This Dockerfile helps developers to get started using SQL Server 2014 Express in Windows Containers. The Dockerfile downloads and installs SQL Server 2014 Express with the default setup parameters that could be changed (if needed) after the image is installed. Note: This dockerfile is based on Buc Rogers' work that can be found [here] (https://github.com/brogersyh/Dockerfiles-for-windows/tree/master/sqlexpress) @@ -35,8 +35,8 @@ To run this sample, you need the following prerequisites. ## Run this sample Use the Dockerfile and execute the following two commands to build and run sqlexpress: -1. docker build -t sqlexpress . -2. docker run -it -p 1433:1433 sqlexpress cmd +1. docker build --env sa_password= . +2. docker run -it -p 1433:1433 cmd @@ -44,7 +44,6 @@ Use the Dockerfile and execute the following two commands to build and run sqlex **High Level Description** The Dockerfile downloads and installs SQL Server 2014 Express with the following default setup parameters that could be changed (if needed) after the image is installed. -- sa password: Password1 - Collation: SQL_Latin1_General_CP1_CI_AS - SQL Instance Name: SQLEXPRESS - Root Directory: C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/start.ps1 b/samples/manage/windows-containers/mssql-server-2014-express-windows/start.ps1 new file mode 100644 index 00000000..1fa234ab --- /dev/null +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/start.ps1 @@ -0,0 +1,17 @@ +# The script sets the sa password and start the SQl Service + +param( +[Parameter(Mandatory=$false)] +[string]$sa_password +) + +# start the service +start-service MSSQL`$SQLEXPRESS + + +if($sa_password -ne "_"){ + $sqlcmd = "ALTER LOGIN sa with password=" +"'" + $sa_password + "'" + ";ALTER LOGIN sa ENABLE;" + Invoke-Sqlcmd -Query $sqlcmd -ServerInstance ".\SQLEXPRESS" +} + +while ($true) { Start-Sleep -Seconds 3600 } \ No newline at end of file From 4f66bdcf61d7b18ff3e81f2d067d9b2b52df2079 Mon Sep 17 00:00:00 2001 From: Perry Skountrianos - MSFT Date: Fri, 10 Jun 2016 16:33:04 -0700 Subject: [PATCH 63/73] Update readme.md --- .../mssql-server-2014-express-windows/readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md index 6e706da6..0d323b27 100644 --- a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md @@ -35,8 +35,9 @@ To run this sample, you need the following prerequisites. ## Run this sample Use the Dockerfile and execute the following two commands to build and run sqlexpress: + 1. docker build --env sa_password= . -2. docker run -it -p 1433:1433 cmd +2. docker run -it -p 1433:1433 From 8c65e144b90f6bc918d5a19b348745155885d311 Mon Sep 17 00:00:00 2001 From: Perry Skountrianos - MSFT Date: Fri, 10 Jun 2016 16:36:19 -0700 Subject: [PATCH 64/73] Update readme.md --- .../mssql-server-2014-express-windows/readme.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md index 0d323b27..bef4bbfe 100644 --- a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md @@ -34,10 +34,8 @@ To run this sample, you need the following prerequisites. ## Run this sample -Use the Dockerfile and execute the following two commands to build and run sqlexpress: - -1. docker build --env sa_password= . -2. docker run -it -p 1433:1433 +The image provides one environment variable to set the sa password:
+- sa_password: Sets the sa password and enables the sa login From 65adc771ffa4c52b1652b6990c23859b722f8f79 Mon Sep 17 00:00:00 2001 From: Perry Skountrianos - MSFT Date: Fri, 10 Jun 2016 18:08:37 -0700 Subject: [PATCH 65/73] Update readme.md --- .../mssql-server-2014-express-windows/readme.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md index bef4bbfe..a994148f 100644 --- a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md @@ -1,5 +1,5 @@ # mssql-server-2014-express-windows -This Dockerfile helps developers to get started using SQL Server 2014 Express in Windows Containers. The Dockerfile downloads and installs SQL Server 2014 Express with the default setup parameters that could be changed (if needed) after the image is installed. +This Dockerfile helps developers to get started using SQL Server 2014 Express in Windows Server Core Containers. The file downloads and installs SQL Server 2014 Express with the default setup parameters that could be changed (if needed). Note: This dockerfile is based on Buc Rogers' work that can be found [here] (https://github.com/brogersyh/Dockerfiles-for-windows/tree/master/sqlexpress) @@ -27,13 +27,12 @@ To run this sample, you need the following prerequisites. **Software prerequisites:** -1. System running Windows Server Technical Preview 4 or later. -2. 10GB available storage for container host image, OS Base Image and setup scripts. -3. Administrator permissions on the system. +1. System running Windows Server Core TP5 v10.0.14300.1000. ## Run this sample + The image provides one environment variable to set the sa password:
- sa_password: Sets the sa password and enables the sa login @@ -41,7 +40,6 @@ The image provides one environment variable to set the sa password:
## Sample details -**High Level Description** The Dockerfile downloads and installs SQL Server 2014 Express with the following default setup parameters that could be changed (if needed) after the image is installed. - Collation: SQL_Latin1_General_CP1_CI_AS - SQL Instance Name: SQLEXPRESS From a28bba5024870c8306e2a727f7c66dcdb28a2e48 Mon Sep 17 00:00:00 2001 From: Perry Skountrianos - MSFT Date: Fri, 10 Jun 2016 18:09:02 -0700 Subject: [PATCH 66/73] Update readme.md --- .../mssql-server-2014-express-windows/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md index a994148f..8a06fa65 100644 --- a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md @@ -1,5 +1,5 @@ # mssql-server-2014-express-windows -This Dockerfile helps developers to get started using SQL Server 2014 Express in Windows Server Core Containers. The file downloads and installs SQL Server 2014 Express with the default setup parameters that could be changed (if needed). +This Dockerfile helps developers to get started using SQL Server 2014 Express in Windows Server Core Containers. The file downloads and installs SQL Server 2014 Express with the default setup parameters. Note: This dockerfile is based on Buc Rogers' work that can be found [here] (https://github.com/brogersyh/Dockerfiles-for-windows/tree/master/sqlexpress) From e742ec8a06ac7d4b5c95e7c4018b6c7f4ec81584 Mon Sep 17 00:00:00 2001 From: Perry Skountrianos - MSFT Date: Fri, 10 Jun 2016 18:11:02 -0700 Subject: [PATCH 67/73] Update readme.md --- .../mssql-server-2014-express-windows/readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md index 8a06fa65..24c76d71 100644 --- a/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md +++ b/samples/manage/windows-containers/mssql-server-2014-express-windows/readme.md @@ -27,7 +27,8 @@ To run this sample, you need the following prerequisites. **Software prerequisites:** -1. System running Windows Server Core TP5 v10.0.14300.1000. +You can run the container with the following command. Note the you'll need Windows Server Core TP5 v10.0.14300.1000. +docker run -p 1433:1433 --env sa_password= microsoft/mssql-server-2014-express-windows From 724269090c146a5d4ee7d0a7299865d6182509df Mon Sep 17 00:00:00 2001 From: Perry Skountrianos - MSFT Date: Mon, 13 Jun 2016 12:47:02 -0700 Subject: [PATCH 68/73] Update App.config --- samples/applications/iot-smart-grid/App.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/applications/iot-smart-grid/App.config b/samples/applications/iot-smart-grid/App.config index 967a0317..04d2d1e4 100644 --- a/samples/applications/iot-smart-grid/App.config +++ b/samples/applications/iot-smart-grid/App.config @@ -4,7 +4,7 @@ - + From ff79feb4698fb72e5ca11582c71a904f7b985b04 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Tue, 14 Jun 2016 08:28:56 -0700 Subject: [PATCH 69/73] cleanup up name --- .../wide-world-importers/wwi-database-scripts/9-wwi-restore.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/databases/wide-world-importers/wwi-database-scripts/9-wwi-restore.sql b/samples/databases/wide-world-importers/wwi-database-scripts/9-wwi-restore.sql index aa44d91f..1474ec47 100644 --- a/samples/databases/wide-world-importers/wwi-database-scripts/9-wwi-restore.sql +++ b/samples/databases/wide-world-importers/wwi-database-scripts/9-wwi-restore.sql @@ -3,7 +3,7 @@ USE [master] ALTER DATABASE [WideWorldImporters] SET SINGLE_USER WITH ROLLBACK IMMEDIATE RESTORE DATABASE [WideWorldImporters] -FROM DISK = N'C:\YourPath\WideWorldImporters_AtShipDate.bak' +FROM DISK = N'C:\YourPath\WideWorldImporters.bak' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 5 ALTER DATABASE [WideWorldImporters] SET MULTI_USER GO From 55076e65509c9c566324e949b0d9a9cb487432ae Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Tue, 14 Jun 2016 09:19:51 -0700 Subject: [PATCH 70/73] Delete Db.dbmdl --- .../in-memory/iot-smart-grid/Db/Db.dbmdl | Bin 6519640 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 samples/features/in-memory/iot-smart-grid/Db/Db.dbmdl diff --git a/samples/features/in-memory/iot-smart-grid/Db/Db.dbmdl b/samples/features/in-memory/iot-smart-grid/Db/Db.dbmdl deleted file mode 100644 index fae450f182e5682b44df5ee1abf23b7b802899ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6519640 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 z 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 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 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�DbJ|`I?Tc*f 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 Date: Tue, 14 Jun 2016 09:21:33 -0700 Subject: [PATCH 71/73] added link to release --- .../features/in-memory/ticket-reservations/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/samples/features/in-memory/ticket-reservations/README.md b/samples/features/in-memory/ticket-reservations/README.md index c71479f7..ab337ce9 100644 --- a/samples/features/in-memory/ticket-reservations/README.md +++ b/samples/features/in-memory/ticket-reservations/README.md @@ -8,11 +8,12 @@ This Windows Forms sample application built on .NET Framework 4.6 demonstrates ## About this sample -1. **Applies to:** SQL Server 2014 (or higher), Azure SQL Database -1. **Key features:** In-Memory OLTP -1. **Workload:** OLTP -1. **Programming Language:** T-SQL, C# -1. **Authors:** Jos de Bruijn +* **Latest release:** [in-memory-oltp-perf-demo-v1.0](https://github.com/Microsoft/sql-server-samples/releases/tag/in-memory-oltp-demo-v1.0) +* **Applies to:** SQL Server 2014 (or higher), Azure SQL Database +* **Key features:** In-Memory OLTP +* **Workload:** OLTP +* **Programming Language:** T-SQL, C# +* **Authors:** Jos de Bruijn ![Alt text](Screenshots/1.png "Ticket Reservations") From 6236cf54e60cb7c47addd6a825708ea00acd2c2d Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Tue, 14 Jun 2016 09:22:48 -0700 Subject: [PATCH 72/73] adding image for in-memory oltp perf --- .gitignore | 3 ++- media/in-memory-oltp-performance.png | Bin 0 -> 43005 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 media/in-memory-oltp-performance.png diff --git a/.gitignore b/.gitignore index 931773c9..b317c54a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateA samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe.config *.zip samples/features/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/CreatePackageFile.bat -samples/features/in-memory/ticket-reservations/TicketReservations/TicketReservations.dbmdl \ No newline at end of file +samples/features/in-memory/ticket-reservations/TicketReservations/TicketReservations.dbmdl +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Release/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs \ No newline at end of file diff --git a/media/in-memory-oltp-performance.png b/media/in-memory-oltp-performance.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e6a7dd3c13c1126be372414cedecbf304a68c8 GIT binary patch literal 43005 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%0D{rQ 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 literal 0 HcmV?d00001 From 305a9a115f99a58c1725e1c4d31d707204241b14 Mon Sep 17 00:00:00 2001 From: Jos de Bruijn Date: Tue, 14 Jun 2016 09:25:02 -0700 Subject: [PATCH 73/73] updated image --- samples/features/in-memory/ticket-reservations/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/features/in-memory/ticket-reservations/README.md b/samples/features/in-memory/ticket-reservations/README.md index ab337ce9..6e167823 100644 --- a/samples/features/in-memory/ticket-reservations/README.md +++ b/samples/features/in-memory/ticket-reservations/README.md @@ -15,7 +15,7 @@ This Windows Forms sample application built on .NET Framework 4.6 demonstrates * **Programming Language:** T-SQL, C# * **Authors:** Jos de Bruijn -![Alt text](Screenshots/1.png "Ticket Reservations") +![Alt text](/media/in-memory-oltp-performance.png "Ticket Reservations") ## Running this sample 1. Before you can run this sample, you must have the following perquisites: