TSQL Challenge 19 - Load Testing Data



/***********************************************************************
 ---------------------------------------------- 
 Load Testing Data for TSQL Challenge 19
 Copyright © beyondrelational.com
 ---------------------------------------------- 

 Notes:
 1. 

 Revision History:
 Rev 00 - 20 April 2010 - Tomas Boixet	- Initial Release
***********************************************************************/

-- Parameters
DECLARE 
	@levels int, 
	@top_level int, 
	@sons int, 
	@orders_emp int;
	
SET @levels=6;		-- Hierarchy levels
SET @top_level=3;	-- Top-level employees
SET @sons=3;		-- Number of sons for each employe
SET @orders_emp=50;	-- Number of orders per employe

-- compute records
DECLARE 
	@numemp int, 
	@numorders int, 
	@n int, 
	@n1 int;
	
SET @n=1;
SET @numemp=@top_level;
SET @n1=@numemp;

WHILE @n<@levels BEGIN 
	SET @n1=@n1*@sons 
	SET @numemp=@numemp+@n1 
	SET @n=@n+1 
END;

PRINT 'Employees: '+CONVERT(varchar,@numemp);
PRINT 'Orders: '+CONVERT(varchar,@numemp*@orders_emp);

-- Create tables
IF OBJECT_ID('TC19_Employees','U') IS NOT NULL 
	DROP TABLE TC19_Employees;
	
CREATE TABLE TC19_Employees(
	EmployeeID INT NOT NULL,
	FirstName VARCHAR(30) NULL,
	LastName VARCHAR(30) NULL,
	ReportsTo INT NULL,
	CONSTRAINT PK_TC19_Employees PRIMARY KEY (EmployeeID ASC) );
CREATE INDEX IX_TC19_Employees ON TC19_Employees (ReportsTo ASC);

IF OBJECT_ID('TC19_Orders','U') IS NOT NULL 
	DROP TABLE TC19_Orders;
	
CREATE TABLE TC19_Orders(
	OrderID INT IDENTITY(1,1) NOT NULL,
	EmployeeID INT NULL,
	CONSTRAINT [PK_TC19_Orders] PRIMARY KEY (OrderID ASC) );
CREATE INDEX IX_TC19_Orders ON TC19_Orders (EmployeeID ASC);

-- Fill tables
WITH e (EmployeeID, FirstName, LastName, ReportsTo, lvlid) AS
(
	SELECT 
		CAST(N AS INT), 
		'FirstName'+CONVERT(varchar, N), 
		'LastName'+CONVERT(varchar, N), 
		CAST(NULL AS int), 
		1
	FROM dbo.tsqlc_Tally 
	WHERE N BETWEEN 1 AND @top_level
	UNION ALL
	SELECT 
		CONVERT(INT, (EmployeeID*@sons)-(N-1)+@top_level),
		'FirstName'+CONVERT(varchar, (EmployeeID*@sons)-(N-1)+@top_level), 
		'LastName'+CONVERT(varchar, (EmployeeID*@sons)-(N-1)+@top_level), 
		EmployeeID, 
		1+lvlid
	FROM e 
	CROSS JOIN dbo.tsqlc_Tally
	WHERE N BETWEEN 1 AND @sons AND lvlid<@levels
) 
INSERT INTO TC19_Employees (
	EmployeeID, 
	FirstName, 
	LastName, 
	ReportsTo)
SELECT 
	EmployeeID, 
	FirstName, 
	LastName, 
	ReportsTo 
FROM e;

INSERT INTO TC19_Orders (EmployeeID)
SELECT 
	EmployeeID
FROM TC19_Employees
CROSS JOIN dbo.tsqlc_Tally
WHERE N BETWEEN 1 AND @orders_emp;