Microsoft dostarcza do testowania MS SQL Server przykładowe dane w postaci szkoleniowej bazy danych AdventureWorks. Wielu na nią narzeka, że zbyt skomplikowana. Dawniej można było uczyć się i ćwiczyć na bazie NorthWind lub Pubs. Były to bazy o o wiele prostszej strukturze. Przykładowe bazy można pobrać z:
- Northwind & Pubs – https://www.microsoft.com/en-us/download/details.aspx?id=23654
- Adventureworks – http://msftdbprodsamples.codeplex.com/ (Baza z nazwą kończącą się na LT oznacza bazę w wersji „Light”, czyli o nieco mniej złożonej strukturze niż pełny AdventureWorks).
Ostatnio jednak kolega potrzebował bazy większej niż AdventureWorks. Chodziło o testowanie aplikacji, która na różne sposoby pobierała by dane. Nie wystarczało zwykłe złączenie sys.objects z samym sobą, bo dane miały mieć strukturę hierarchiczną. Kilka prób i poniżej masz skrypt, który podwaja zamówienia (przepisując istniejące). Skrypt można uruchamiać nawet kilka razy, co spowoduje zawsze podwajanie rekordów w tabelach Sales.OrderHeader i Sales.OrderDetail:
USE [AdventureWorks2014]
--BEGIN TRAN
--stan przed
SELECT COUNT(*) FROM Sales.SalesOrderHeader
SELECT COUNT(*) FROM [Sales].[SalesOrderDetail]
--chwilowe dodanie id
ALTER TABLE Sales.SalesOrderHeader ADD old_id int
go
--zdublowanie zamowien
INSERT INTO Sales.SalesOrderHeader
([RevisionNumber]
,[OrderDate]
,[DueDate]
,[ShipDate]
,[Status]
,[OnlineOrderFlag]
,[PurchaseOrderNumber]
,[AccountNumber]
,[CustomerID]
,[SalesPersonID]
,[TerritoryID]
,[BillToAddressID]
,[ShipToAddressID]
,[ShipMethodID]
,[CreditCardID]
,[CreditCardApprovalCode]
,[CurrencyRateID]
,[SubTotal]
,[TaxAmt]
,[Freight]
,[Comment]
,[rowguid]
,[ModifiedDate]
,[old_id])
SELECT
[RevisionNumber]
,[OrderDate]
,[DueDate]
,[ShipDate]
,[Status]
,[OnlineOrderFlag]
,[PurchaseOrderNumber]
,[AccountNumber]
,[CustomerID]
,[SalesPersonID]
,[TerritoryID]
,[BillToAddressID]
,[ShipToAddressID]
,[ShipMethodID]
,[CreditCardID]
,[CreditCardApprovalCode]
,[CurrencyRateID]
,[SubTotal]
,[TaxAmt]
,[Freight]
,[Comment]
,NEWID()
,[ModifiedDate]
,SalesOrderID
FROM Sales.SalesOrderHeader
--zdublowanie pozycji zamowien
INSERT INTO Sales.SalesOrderDetail
([SalesOrderID]
,[CarrierTrackingNumber]
,[OrderQty]
,[ProductID]
,[SpecialOfferID]
,[UnitPrice]
,[UnitPriceDiscount]
,[rowguid]
,[ModifiedDate])
SELECT oh.[SalesOrderID]
,[CarrierTrackingNumber]
,[OrderQty]
,[ProductID]
,[SpecialOfferID]
,[UnitPrice]
,[UnitPriceDiscount]
,NEWID()
,GetDate()
FROM Sales.SalesOrderDetail od
JOIN Sales.SalesOrderHeader oh ON od.SalesOrderID = oh.old_id
ALTER TABLE Sales.SalesOrderHeader DROP column old_id
--stan po
SELECT COUNT(*) FROM Sales.SalesOrderHeader
SELECT COUNT(*) FROM Sales.SalesOrderDetail
--COMMIT