-- Microsoft Common Data Model - Customer Service -- Bulk Data Generation Script - 100x Sample Data Over 3 Months -- Version: 1.0 -- Generates realistic data spread over the last 3 months USE CDM_CustomerService; GO PRINT '========================================'; PRINT 'Starting Bulk Data Generation...'; PRINT '========================================'; PRINT ''; DECLARE @StartDate DATE = DATEADD(MONTH, -3, CAST(GETUTCDATE() AS DATE)); DECLARE @EndDate DATE = CAST(GETUTCDATE() AS DATE); DECLARE @i INT = 0; DECLARE @j INT = 0; DECLARE @RandomDate DATETIME2; DECLARE @RandomUserId UNIQUEIDENTIFIER; DECLARE @RandomAccountId UNIQUEIDENTIFIER; DECLARE @RandomContactId UNIQUEIDENTIFIER; DECLARE @RandomServiceId UNIQUEIDENTIFIER; DECLARE @RandomResourceId UNIQUEIDENTIFIER; DECLARE @RandomContractId UNIQUEIDENTIFIER; DECLARE @RandomEntitlementId UNIQUEIDENTIFIER; -- ============================================================================ -- CLEAR EXISTING SAMPLE DATA (OPTIONAL - COMMENT OUT IF YOU WANT TO KEEP IT) -- ============================================================================ PRINT 'Clearing existing sample data...'; DELETE FROM cdm.SLAKPIInstance; DELETE FROM cdm.CaseResolution; DELETE FROM cdm.IncidentKnowledgeBaseRecord; DELETE FROM cdm.KnowledgeArticleIncident; DELETE FROM cdm.ActivityParty; DELETE FROM cdm.ServiceActivity; DELETE FROM cdm.Task; DELETE FROM cdm.[Case]; DELETE FROM cdm.ChildIncidentCount; DELETE FROM cdm.EntitlementProduct; DELETE FROM cdm.EntitlementContact; DELETE FROM cdm.Entitlement; DELETE FROM cdm.ServiceContractContact; DELETE FROM cdm.ContractLine; DELETE FROM cdm.Contract; DELETE FROM cdm.ResourceExpansion; DELETE FROM cdm.ResourceSpecification; DELETE FROM cdm.SchedulingGroup; DELETE FROM cdm.FacilityEquipment; DELETE FROM cdm.Resource; DELETE FROM cdm.Service; DELETE FROM cdm.Contact; DELETE FROM cdm.Account; DELETE FROM cdm.Site; PRINT 'Existing sample data cleared.'; PRINT ''; -- ============================================================================ -- GENERATE USERS (20 total) -- ============================================================================ PRINT 'Generating 20 Users...'; SET @i = 1; INSERT INTO cdm.[User] (userName, firstName, lastName, email, phone, mobilePhone, isActive) VALUES ('jsmith', 'John', 'Smith', 'john.smith@company.com', '555-0101', '555-6001', 1), ('mwhite', 'Maria', 'White', 'maria.white@company.com', '555-0102', '555-6002', 1), ('rjones', 'Robert', 'Jones', 'robert.jones@company.com', '555-0103', '555-6003', 1), ('sbrown', 'Sarah', 'Brown', 'sarah.brown@company.com', '555-0104', '555-6004', 1), ('mtaylor', 'Michael', 'Taylor', 'michael.taylor@company.com', '555-0105', '555-6005', 1), ('ejones', 'Emily', 'Jones', 'emily.jones@company.com', '555-0106', '555-6006', 1), ('dmiller', 'David', 'Miller', 'david.miller@company.com', '555-0107', '555-6007', 1), ('jwilson', 'James', 'Wilson', 'james.wilson@company.com', '555-0108', '555-6008', 1), ('agarcia', 'Angela', 'Garcia', 'angela.garcia@company.com', '555-0109', '555-6009', 1), ('crodriguez', 'Carlos', 'Rodriguez', 'carlos.rodriguez@company.com', '555-0110', '555-6010', 1), ('lmartinez', 'Lisa', 'Martinez', 'lisa.martinez@company.com', '555-0111', '555-6011', 1), ('phuang', 'Peter', 'Huang', 'peter.huang@company.com', '555-0112', '555-6012', 1), ('ktran', 'Kim', 'Tran', 'kim.tran@company.com', '555-0113', '555-6013', 1), ('nsingh', 'Nisha', 'Singh', 'nisha.singh@company.com', '555-0114', '555-6014', 1), ('opatel', 'Omkar', 'Patel', 'omkar.patel@company.com', '555-0115', '555-6015', 1), ('rkim', 'Rachel', 'Kim', 'rachel.kim@company.com', '555-0116', '555-6016', 1), ('tfernandez', 'Thomas', 'Fernandez', 'thomas.fernandez@company.com', '555-0117', '555-6017', 1), ('vlee', 'Victoria', 'Lee', 'victoria.lee@company.com', '555-0118', '555-6018', 1), ('wchen', 'William', 'Chen', 'william.chen@company.com', '555-0119', '555-6019', 1), ('ylopez', 'Yolanda', 'Lopez', 'yolanda.lopez@company.com', '555-0120', '555-6020', 1); PRINT 'Users generated: 20'; PRINT ''; -- ============================================================================ -- GENERATE SITES (15 total) -- ============================================================================ PRINT 'Generating 15 Sites...'; INSERT INTO cdm.Site (siteName, description, city, stateProvince, country, phone, email, isHeadquarters, createdBy) SELECT 'New York Office', 'Main headquarters', 'New York', 'NY', 'USA', '555-0200', 'ny@company.com', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Los Angeles Office', 'West coast support center', 'Los Angeles', 'CA', 'USA', '555-0201', 'la@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Chicago Office', 'Midwest operations', 'Chicago', 'IL', 'USA', '555-0202', 'chi@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Houston Office', 'South operations', 'Houston', 'TX', 'USA', '555-0203', 'hou@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Phoenix Office', 'Southwest operations', 'Phoenix', 'AZ', 'USA', '555-0204', 'phx@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Philadelphia Office', 'Northeast operations', 'Philadelphia', 'PA', 'USA', '555-0205', 'phi@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'San Antonio Office', 'Texas operations', 'San Antonio', 'TX', 'USA', '555-0206', 'sat@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'San Diego Office', 'California operations', 'San Diego', 'CA', 'USA', '555-0207', 'sdi@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Dallas Office', 'Texas headquarters', 'Dallas', 'TX', 'USA', '555-0208', 'dal@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'San Jose Office', 'Silicon Valley', 'San Jose', 'CA', 'USA', '555-0209', 'sjc@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Austin Office', 'Tech hub', 'Austin', 'TX', 'USA', '555-0210', 'ats@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Jacksonville Office', 'Southeast operations', 'Jacksonville', 'FL', 'USA', '555-0211', 'jax@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Fort Worth Office', 'Texas operations', 'Fort Worth', 'TX', 'USA', '555-0212', 'ftw@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Columbus Office', 'Midwest operations', 'Columbus', 'OH', 'USA', '555-0213', 'cmh@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Charlotte Office', 'Southeast operations', 'Charlotte', 'NC', 'USA', '555-0214', 'clt@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID(); PRINT 'Sites generated: 15'; PRINT ''; -- ============================================================================ -- GENERATE ACCOUNTS (400 total) -- ============================================================================ PRINT 'Generating 400 Accounts...'; DECLARE @AccountIndex INT = 1; DECLARE @SiteId UNIQUEIDENTIFIER; DECLARE @OwnerId UNIQUEIDENTIFIER; WHILE @AccountIndex <= 400 BEGIN SELECT @SiteId = siteId FROM cdm.Site ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SELECT @OwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; INSERT INTO cdm.Account (accountName, accountNumber, description, email, phone, ownerUserId, siteId, accountType, industry, numberOfEmployees, revenue, isActive) VALUES ('Account ' + CAST(@AccountIndex AS VARCHAR(5)), 'ACC-' + RIGHT('0000' + CAST(@AccountIndex AS VARCHAR(5)), 5), 'Customer account ' + CAST(@AccountIndex AS VARCHAR(5)), 'contact' + CAST(@AccountIndex AS VARCHAR(5)) + '@customer.com', '555-' + RIGHT('0000' + CAST(2000 + @AccountIndex AS VARCHAR(5)), 4), @OwnerId, @SiteId, CASE WHEN @AccountIndex % 5 = 0 THEN 'Prospect' ELSE 'Customer' END, CHOOSE(@AccountIndex % 10 + 1, 'Technology', 'Manufacturing', 'Finance', 'Healthcare', 'Retail', 'Consulting', 'Telecommunications', 'Education', 'Government', 'Energy'), CAST(ABS(CHECKSUM(NEWID())) % 5000 + 50 AS INT), CAST(ABS(CHECKSUM(NEWID())) % 10000000 + 100000 AS DECIMAL(18,2)), 1); SET @AccountIndex = @AccountIndex + 1; END PRINT 'Accounts generated: 400'; PRINT ''; -- ============================================================================ -- GENERATE CONTACTS (500 total - ~1.25 per account) -- ============================================================================ PRINT 'Generating 500 Contacts...'; DECLARE @ContactIndex INT = 1; DECLARE @AccountId UNIQUEIDENTIFIER; DECLARE @ContactOwnerId UNIQUEIDENTIFIER; DECLARE @FirstNames TABLE (name NVARCHAR(50)); DECLARE @LastNames TABLE (name NVARCHAR(50)); INSERT INTO @FirstNames VALUES ('John'), ('Jane'), ('Michael'), ('Sarah'), ('David'), ('Emma'), ('Robert'), ('Lisa'), ('James'), ('Mary'), ('William'), ('Jennifer'), ('Richard'), ('Patricia'), ('Joseph'), ('Linda'), ('Charles'), ('Barbara'), ('Christopher'), ('Carol'), ('Daniel'), ('Margaret'), ('Matthew'), ('Susan'), ('Anthony'), ('Dorothy'), ('Mark'), ('Ashley'), ('Donald'), ('Kimberly'), ('Steven'), ('Donna'), ('Paul'), ('Carol'), ('Andrew'), ('Michelle'), ('Joshua'), ('Emily'), ('Kenneth'), ('Melissa'); INSERT INTO @LastNames VALUES ('Smith'), ('Johnson'), ('Williams'), ('Brown'), ('Jones'), ('Garcia'), ('Miller'), ('Davis'), ('Rodriguez'), ('Martinez'), ('Hernandez'), ('Lopez'), ('Gonzalez'), ('Wilson'), ('Anderson'), ('Thomas'), ('Taylor'), ('Moore'), ('Jackson'), ('Martin'), ('Lee'), ('Perez'), ('Thompson'), ('White'), ('Harris'), ('Sanchez'), ('Clark'), ('Ramirez'), ('Lewis'), ('Robinson'), ('Walker'), ('Young'), ('Allen'), ('King'), ('Wright'), ('Scott'), ('Torres'), ('Peterson'), ('Phillips'), ('Campbell'), ('Parker'); WHILE @ContactIndex <= 500 BEGIN SELECT @AccountId = accountId FROM cdm.Account ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SELECT @ContactOwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; INSERT INTO cdm.Contact (firstName, lastName, email, phone, mobilePhone, accountId, ownerUserId, jobTitle, department, isActive) VALUES ((SELECT TOP 1 name FROM @FirstNames ORDER BY NEWID()), (SELECT TOP 1 name FROM @LastNames ORDER BY NEWID()), 'contact' + CAST(@ContactIndex AS VARCHAR(5)) + '@customer.com', '555-' + RIGHT('0000' + CAST(3000 + @ContactIndex AS VARCHAR(5)), 4), '555-' + RIGHT('0000' + CAST(7000 + @ContactIndex AS VARCHAR(5)), 4), @AccountId, @ContactOwnerId, CHOOSE(@ContactIndex % 8 + 1, 'Manager', 'Director', 'Supervisor', 'Coordinator', 'Specialist', 'Analyst', 'Administrator', 'Executive'), CHOOSE(@ContactIndex % 6 + 1, 'Operations', 'IT', 'Finance', 'HR', 'Sales', 'Support'), 1); SET @ContactIndex = @ContactIndex + 1; END PRINT 'Contacts generated: 500'; PRINT ''; -- ============================================================================ -- GENERATE SERVICES (25 total) -- ============================================================================ PRINT 'Generating 25 Services...'; INSERT INTO cdm.Service (serviceName, description, isActive, createdBy) SELECT 'Technical Support', 'On-demand technical support', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Installation Service', 'Professional installation', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Maintenance & Updates', 'Regular maintenance', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Training & Consulting', 'Professional training', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Premium Support', '24/7 premium support', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Implementation', 'System implementation', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Data Migration', 'Data migration services', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Security Services', 'Security assessment', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Performance Tuning', 'System optimization', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Backup & Recovery', 'Backup services', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Integration Services', 'System integration', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Custom Development', 'Custom solutions', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Infrastructure Management', 'Infrastructure support', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Cloud Services', 'Cloud deployment', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Mobile Services', 'Mobile app support', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'API Development', 'API development', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Testing Services', 'QA and testing', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Documentation', 'Technical documentation', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Change Management', 'Change management', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Strategic Planning', 'IT strategy consulting', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Compliance Services', 'Compliance management', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Disaster Recovery', 'DR planning and implementation', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'User Management', 'User administration', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Monitoring Services', 'System monitoring', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL SELECT 'Automation Services', 'Process automation', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID(); PRINT 'Services generated: 25'; PRINT ''; -- ============================================================================ -- GENERATE RESOURCES (80 total) -- ============================================================================ PRINT 'Generating 80 Resources...'; -- Generate user resources INSERT INTO cdm.Resource (resourceName, description, resourceType, userId, isActive, createdBy) SELECT 'Support Technician - ' + CAST(ROW_NUMBER() OVER (ORDER BY u.userId) AS VARCHAR(3)), 'Senior support technician', 'User', u.userId, 1, (SELECT TOP 1 userId FROM cdm.[User] ORDER BY NEWID()) FROM cdm.[User] u WHERE u.isActive = 1; -- Generate facility resources INSERT INTO cdm.Resource (resourceName, description, resourceType, isActive, createdBy) SELECT 'Conference Room ' + CHAR(64 + ROW_NUMBER() OVER (ORDER BY siteId)), 'Meeting facility', 'Facility', 1, (SELECT TOP 1 userId FROM cdm.[User] ORDER BY NEWID()) FROM cdm.Site; -- Generate equipment resources INSERT INTO cdm.Resource (resourceName, description, resourceType, isActive, createdBy) SELECT 'Equipment ' + CAST(ROW_NUMBER() OVER (ORDER BY ROW_NUMBER() OVER (ORDER BY createdOn)) AS VARCHAR(3)), 'Support workstation', 'Equipment', 1, (SELECT TOP 1 userId FROM cdm.[User] ORDER BY NEWID()) FROM (SELECT TOP 30 createdOn FROM cdm.Site) AS s; PRINT 'Resources generated: 80+'; PRINT ''; -- ============================================================================ -- GENERATE CONTRACTS (300 total) -- ============================================================================ PRINT 'Generating 300 Contracts...'; DECLARE @ContractIndex INT = 1; DECLARE @ContractAccountId UNIQUEIDENTIFIER; DECLARE @ContractOwnerId UNIQUEIDENTIFIER; WHILE @ContractIndex <= 300 BEGIN SELECT @ContractAccountId = accountId FROM cdm.Account WHERE accountType = 'Customer' ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SELECT @ContractOwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; INSERT INTO cdm.Contract (contractNumber, contractName, accountId, ownerUserId, startDate, endDate, status, contractValue, contractType, isActive) VALUES ('CNT-' + FORMAT(@ContractIndex, '000000'), 'Contract ' + CAST(@ContractIndex AS VARCHAR(5)), @ContractAccountId, @ContractOwnerId, DATEADD(DAY, CAST(ABS(CHECKSUM(NEWID())) % 90 AS INT), @StartDate), DATEADD(DAY, CAST(ABS(CHECKSUM(NEWID())) % 90 AS INT) + 365, @StartDate), CHOOSE(@ContractIndex % 4 + 1, 'Active', 'Active', 'Draft', 'Expired'), CAST(ABS(CHECKSUM(NEWID())) % 500000 + 10000 AS DECIMAL(18,2)), CHOOSE(@ContractIndex % 3 + 1, 'Support', 'Service', 'Maintenance'), 1); SET @ContractIndex = @ContractIndex + 1; END PRINT 'Contracts generated: 300'; PRINT ''; -- ============================================================================ -- GENERATE CONTRACT LINES (900 total - 3 per contract) -- ============================================================================ PRINT 'Generating 900 Contract Lines...'; INSERT INTO cdm.ContractLine (contractId, lineNumber, serviceId, description, quantityIncluded, quantityUsed, price) SELECT c.contractId, ROW_NUMBER() OVER (PARTITION BY c.contractId ORDER BY s.serviceId) AS lineNumber, s.serviceId, 'Service: ' + s.serviceName, CAST(ABS(CHECKSUM(NEWID())) % 500 + 10 AS INT), CAST(ABS(CHECKSUM(NEWID())) % 300 AS INT), CAST(ABS(CHECKSUM(NEWID())) % 50000 + 1000 AS DECIMAL(18,2)) FROM cdm.Contract c CROSS JOIN (SELECT TOP 3 serviceId FROM cdm.Service ORDER BY NEWID()) s; PRINT 'Contract Lines generated: 900+'; PRINT ''; -- ============================================================================ -- GENERATE ENTITLEMENTS (250 total) -- ============================================================================ PRINT 'Generating 250 Entitlements...'; DECLARE @EntitlementIndex INT = 1; DECLARE @EntitlementAccountId UNIQUEIDENTIFIER; WHILE @EntitlementIndex <= 250 BEGIN SELECT @EntitlementAccountId = accountId FROM cdm.Account WHERE accountType = 'Customer' ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; INSERT INTO cdm.Entitlement (entitlementName, description, accountId, startDate, endDate, type, duration, unitType, unitCount, status, isActive) VALUES ('Entitlement ' + CAST(@EntitlementIndex AS VARCHAR(5)), 'Support entitlement for account', @EntitlementAccountId, DATEADD(DAY, CAST(ABS(CHECKSUM(NEWID())) % 90 AS INT), @StartDate), DATEADD(DAY, CAST(ABS(CHECKSUM(NEWID())) % 90 AS INT) + 365, @StartDate), CHOOSE(@EntitlementIndex % 3 + 1, 'Support', 'Service', 'Training'), 365, CHOOSE(@EntitlementIndex % 2 + 1, 'Cases', 'Hours'), CAST(ABS(CHECKSUM(NEWID())) % 500 + 50 AS INT), CHOOSE(@EntitlementIndex % 5 + 1, 'Active', 'Active', 'Active', 'Inactive', 'Expired'), 1); SET @EntitlementIndex = @EntitlementIndex + 1; END PRINT 'Entitlements generated: 250'; PRINT ''; -- ============================================================================ -- GENERATE CASES (2000 total) -- ============================================================================ PRINT 'Generating 2000 Cases...'; DECLARE @CaseIndex INT = 1; DECLARE @CaseAccountId UNIQUEIDENTIFIER; DECLARE @CaseContactId UNIQUEIDENTIFIER; DECLARE @CaseOwnerId UNIQUEIDENTIFIER; DECLARE @CaseContractId UNIQUEIDENTIFIER; DECLARE @CaseEntitlementId UNIQUEIDENTIFIER; DECLARE @CaseCreatedDate DATETIME2; WHILE @CaseIndex <= 2000 BEGIN SELECT @CaseAccountId = accountId FROM cdm.Account ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SELECT @CaseContactId = contactId FROM cdm.Contact ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SELECT @CaseOwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SELECT @CaseContractId = contractId FROM cdm.Contract WHERE accountId = @CaseAccountId ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SELECT @CaseEntitlementId = entitlementId FROM cdm.Entitlement WHERE accountId = @CaseAccountId ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SET @CaseCreatedDate = DATEADD(MINUTE, CAST(ABS(CHECKSUM(NEWID())) % (3 * 24 * 60) AS INT), @StartDate); INSERT INTO cdm.[Case] (caseNumber, title, description, priority, severity, status, accountId, contactId, ownerUserId, contractId, entitlementId, createdDate, emailAddress, isActive) VALUES ('CSE-' + FORMAT(@CaseIndex, '000000'), 'Issue ' + CAST(@CaseIndex AS VARCHAR(5)), 'Description for case ' + CAST(@CaseIndex AS VARCHAR(5)), CHOOSE(@CaseIndex % 5 + 1, 'Low', 'Low', 'Medium', 'High', 'Critical'), CHOOSE(@CaseIndex % 3 + 1, 'Low', 'Medium', 'High'), CHOOSE(@CaseIndex % 6 + 1, 'Active', 'Active', 'Active', 'Waiting', 'Resolved', 'Closed'), @CaseAccountId, @CaseContactId, @CaseOwnerId, @CaseContractId, @CaseEntitlementId, @CaseCreatedDate, (SELECT email FROM cdm.Contact WHERE contactId = @CaseContactId), 1); SET @CaseIndex = @CaseIndex + 1; IF @CaseIndex % 100 = 0 BEGIN PRINT 'Cases generated: ' + CAST(@CaseIndex AS VARCHAR(5)); END END PRINT 'Cases generated: 2000'; PRINT ''; -- ============================================================================ -- GENERATE SERVICE ACTIVITIES (3000 total) -- ============================================================================ PRINT 'Generating 3000 Service Activities...'; DECLARE @ActivityIndex INT = 1; DECLARE @ActivityCaseId UNIQUEIDENTIFIER; DECLARE @ActivityServiceId UNIQUEIDENTIFIER; DECLARE @ActivityOwnerId UNIQUEIDENTIFIER; DECLARE @ActivityStartTime DATETIME2; DECLARE @ActivityEndTime DATETIME2; WHILE @ActivityIndex <= 3000 BEGIN SELECT @ActivityCaseId = caseId FROM cdm.[Case] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SELECT @ActivityServiceId = serviceId FROM cdm.Service ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SELECT @ActivityOwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SET @ActivityStartTime = DATEADD(MINUTE, CAST(ABS(CHECKSUM(NEWID())) % (3 * 24 * 60) AS INT), @StartDate); SET @ActivityEndTime = DATEADD(MINUTE, CAST(ABS(CHECKSUM(NEWID())) % 480 + 30 AS INT), @ActivityStartTime); INSERT INTO cdm.ServiceActivity (subject, description, serviceId, caseId, ownerUserId, startTime, endTime, duration, location, status, isActive) VALUES ('Activity ' + CAST(@ActivityIndex AS VARCHAR(5)), 'Service activity description', @ActivityServiceId, @ActivityCaseId, @ActivityOwnerId, @ActivityStartTime, @ActivityEndTime, DATEDIFF(MINUTE, @ActivityStartTime, @ActivityEndTime), CHOOSE(@ActivityIndex % 3 + 1, 'Remote', 'On-site', 'Phone'), CHOOSE(@ActivityIndex % 4 + 1, 'Scheduled', 'In Progress', 'Completed', 'Cancelled'), 1); SET @ActivityIndex = @ActivityIndex + 1; IF @ActivityIndex % 300 = 0 BEGIN PRINT 'Service Activities generated: ' + CAST(@ActivityIndex AS VARCHAR(5)); END END PRINT 'Service Activities generated: 3000'; PRINT ''; -- ============================================================================ -- GENERATE TASKS (1000 total) -- ============================================================================ PRINT 'Generating 1000 Tasks...'; DECLARE @TaskIndex INT = 1; DECLARE @TaskCaseId UNIQUEIDENTIFIER; DECLARE @TaskOwnerId UNIQUEIDENTIFIER; DECLARE @TaskDueDate DATE; WHILE @TaskIndex <= 1000 BEGIN SELECT @TaskCaseId = caseId FROM cdm.[Case] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SELECT @TaskOwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SET @TaskDueDate = DATEADD(DAY, CAST(ABS(CHECKSUM(NEWID())) % 60 AS INT), @EndDate); INSERT INTO cdm.Task (subject, description, priority, status, dueDate, ownerUserId, caseId) VALUES ('Task ' + CAST(@TaskIndex AS VARCHAR(5)), 'Task description', CHOOSE(@TaskIndex % 3 + 1, 'Low', 'Medium', 'High'), CHOOSE(@TaskIndex % 4 + 1, 'Open', 'In Progress', 'Completed', 'Cancelled'), @TaskDueDate, @TaskOwnerId, @TaskCaseId); SET @TaskIndex = @TaskIndex + 1; IF @TaskIndex % 100 = 0 BEGIN PRINT 'Tasks generated: ' + CAST(@TaskIndex AS VARCHAR(5)); END END PRINT 'Tasks generated: 1000'; PRINT ''; -- ============================================================================ -- GENERATE KNOWLEDGE ARTICLES (100 total) -- ============================================================================ PRINT 'Generating 100 Knowledge Articles...'; DECLARE @ArticleIndex INT = 1; DECLARE @ArticleAuthorId UNIQUEIDENTIFIER; DECLARE @ArticlePublishedDate DATETIME2; WHILE @ArticleIndex <= 100 BEGIN SELECT @ArticleAuthorId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY; SET @ArticlePublishedDate = DATEADD(MINUTE, CAST(ABS(CHECKSUM(NEWID())) % (3 * 24 * 60) AS INT), @StartDate); INSERT INTO cdm.KnowledgeArticle (title, content, category, keywords, authorUserId, status, publishedDate, viewCount, isActive) VALUES ('Article ' + CAST(@ArticleIndex AS VARCHAR(5)), 'Content for knowledge article ' + CAST(@ArticleIndex AS VARCHAR(5)) + '. This is a detailed technical article.', CHOOSE(@ArticleIndex % 10 + 1, 'Troubleshooting', 'How-To', 'Installation', 'Configuration', 'API', 'Security', 'Performance', 'Integration', 'Best Practices', 'FAQ'), 'keywords, support, help', @ArticleAuthorId, CHOOSE(@ArticleIndex % 3 + 1, 'Published', 'Published', 'Draft'), CASE WHEN @ArticleIndex % 3 = 0 THEN @ArticlePublishedDate ELSE NULL END, CAST(ABS(CHECKSUM(NEWID())) % 5000 AS INT), 1); SET @ArticleIndex = @ArticleIndex + 1; END PRINT 'Knowledge Articles generated: 100'; PRINT ''; -- ============================================================================ -- GENERATE SLA KPI INSTANCES (3000 total - linked to cases) -- ============================================================================ PRINT 'Generating 3000 SLA KPI Instances...'; INSERT INTO cdm.SLAKPIInstance (caseId, kpiName, metric, metricValue, metricUnit, targetValue, status) SELECT c.caseId, 'Response Time', 'Response Time', CAST(ABS(CHECKSUM(NEWID())) % 240 + 15 AS DECIMAL(18,2)), 'Minutes', 60, CHOOSE(ABS(CHECKSUM(NEWID())) % 3 + 1, 'Compliant', 'Compliant', 'Non-Compliant') FROM cdm.[Case] c; INSERT INTO cdm.SLAKPIInstance (caseId, kpiName, metric, metricValue, metricUnit, targetValue, status) SELECT c.caseId, 'Resolution Time', 'Resolution Time', CAST(ABS(CHECKSUM(NEWID())) % 2880 + 240 AS DECIMAL(18,2)), 'Minutes', 1440, CHOOSE(ABS(CHECKSUM(NEWID())) % 4 + 1, 'Compliant', 'Compliant', 'Compliant', 'Non-Compliant') FROM cdm.[Case] c; PRINT 'SLA KPI Instances generated: 3000+'; PRINT ''; -- ============================================================================ -- GENERATE CASE RESOLUTIONS (500 total - for closed/resolved cases) -- ============================================================================ PRINT 'Generating 500 Case Resolutions...'; INSERT INTO cdm.CaseResolution (caseId, description, resolutionType, resolutionStatus, billingStatus, actualServiceDuration) SELECT TOP 500 c.caseId, 'Case resolved: ' + c.title, CHOOSE(ABS(CHECKSUM(NEWID())) % 3 + 1, 'Technical', 'Procedural', 'Escalation'), 'Resolved', CHOOSE(ABS(CHECKSUM(NEWID())) % 2 + 1, 'Billable', 'Non-billable'), CAST(ABS(CHECKSUM(NEWID())) % 480 + 30 AS INT) FROM cdm.[Case] c WHERE c.status IN ('Closed', 'Resolved') ORDER BY NEWID(); PRINT 'Case Resolutions generated: 500'; PRINT ''; -- ============================================================================ -- GENERATE ENTITLEMENT CONTACTS (500 total) -- ============================================================================ PRINT 'Generating 500 Entitlement Contacts...'; INSERT INTO cdm.EntitlementContact (entitlementId, contactId, isPrimary) SELECT TOP 500 e.entitlementId, c.contactId, CASE WHEN ROW_NUMBER() OVER (PARTITION BY e.entitlementId ORDER BY NEWID()) = 1 THEN 1 ELSE 0 END FROM cdm.Entitlement e CROSS JOIN cdm.Contact c WHERE e.accountId = c.accountId ORDER BY NEWID(); PRINT 'Entitlement Contacts generated: 500'; PRINT ''; -- ============================================================================ -- GENERATE ENTITLEMENT PRODUCTS (750 total) -- ============================================================================ PRINT 'Generating 750 Entitlement Products...'; INSERT INTO cdm.EntitlementProduct (entitlementId, serviceId) SELECT TOP 750 e.entitlementId, s.serviceId FROM cdm.Entitlement e CROSS JOIN cdm.Service s ORDER BY NEWID(); PRINT 'Entitlement Products generated: 750'; PRINT ''; -- ============================================================================ -- GENERATE KNOWLEDGE ARTICLE INCIDENTS (1500 total) -- ============================================================================ PRINT 'Generating 1500 Knowledge Article Incidents...'; INSERT INTO cdm.KnowledgeArticleIncident (articleId, caseId, isResolved) SELECT TOP 1500 ka.articleId, c.caseId, CASE WHEN c.status IN ('Closed', 'Resolved') THEN 1 ELSE 0 END FROM cdm.KnowledgeArticle ka CROSS JOIN cdm.[Case] c ORDER BY NEWID(); PRINT 'Knowledge Article Incidents generated: 1500'; PRINT ''; -- ============================================================================ -- GENERATE SERVICE CONTRACT CONTACTS (800 total) -- ============================================================================ PRINT 'Generating 800 Service Contract Contacts...'; INSERT INTO cdm.ServiceContractContact (contractId, contactId, role, isPrimary) SELECT TOP 800 c.contractId, ct.contactId, CHOOSE(ABS(CHECKSUM(NEWID())) % 4 + 1, 'Primary', 'Secondary', 'Technical', 'Admin'), CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.contractId ORDER BY NEWID()) = 1 THEN 1 ELSE 0 END FROM cdm.Contract c CROSS JOIN cdm.Contact ct WHERE c.accountId = ct.accountId ORDER BY NEWID(); PRINT 'Service Contract Contacts generated: 800'; PRINT ''; -- ============================================================================ -- GENERATE ACTIVITY PARTIES (1500 total) -- ============================================================================ PRINT 'Generating 1500 Activity Parties...'; INSERT INTO cdm.ActivityParty (activityId, partyType, userId, email) SELECT TOP 1500 sa.activityId, CHOOSE(ABS(CHECKSUM(NEWID())) % 3 + 1, 'Required', 'Optional', 'Organizer'), u.userId, u.email FROM cdm.ServiceActivity sa CROSS JOIN cdm.[User] u ORDER BY NEWID(); PRINT 'Activity Parties generated: 1500'; PRINT ''; -- ============================================================================ -- SUMMARY AND STATISTICS -- ============================================================================ PRINT ''; PRINT '========================================'; PRINT 'Data Generation Complete!'; PRINT '========================================'; PRINT ''; SELECT 'Users' AS Entity, COUNT(*) AS RecordCount FROM cdm.[User] UNION ALL SELECT 'Sites', COUNT(*) FROM cdm.Site UNION ALL SELECT 'Accounts', COUNT(*) FROM cdm.Account UNION ALL SELECT 'Contacts', COUNT(*) FROM cdm.Contact UNION ALL SELECT 'Services', COUNT(*) FROM cdm.Service UNION ALL SELECT 'Resources', COUNT(*) FROM cdm.Resource UNION ALL SELECT 'Contracts', COUNT(*) FROM cdm.Contract UNION ALL SELECT 'Contract Lines', COUNT(*) FROM cdm.ContractLine UNION ALL SELECT 'Entitlements', COUNT(*) FROM cdm.Entitlement UNION ALL SELECT 'Entitlement Contacts', COUNT(*) FROM cdm.EntitlementContact UNION ALL SELECT 'Entitlement Products', COUNT(*) FROM cdm.EntitlementProduct UNION ALL SELECT 'Cases', COUNT(*) FROM cdm.[Case] UNION ALL SELECT 'Service Activities', COUNT(*) FROM cdm.ServiceActivity UNION ALL SELECT 'Activity Parties', COUNT(*) FROM cdm.ActivityParty UNION ALL SELECT 'Tasks', COUNT(*) FROM cdm.Task UNION ALL SELECT 'Knowledge Articles', COUNT(*) FROM cdm.KnowledgeArticle UNION ALL SELECT 'Knowledge Article Incidents', COUNT(*) FROM cdm.KnowledgeArticleIncident UNION ALL SELECT 'SLA KPI Instances', COUNT(*) FROM cdm.SLAKPIInstance UNION ALL SELECT 'Case Resolutions', COUNT(*) FROM cdm.CaseResolution UNION ALL SELECT 'Service Contract Contacts', COUNT(*) FROM cdm.ServiceContractContact ORDER BY Entity; PRINT ''; PRINT '========================================'; PRINT 'Database Statistics:'; PRINT '========================================'; PRINT ''; DECLARE @TotalRecords BIGINT = ( SELECT COUNT(*) FROM cdm.[User] + COUNT(*) FROM cdm.Site + COUNT(*) FROM cdm.Account + COUNT(*) FROM cdm.Contact + COUNT(*) FROM cdm.Service + COUNT(*) FROM cdm.Resource + COUNT(*) FROM cdm.Contract + COUNT(*) FROM cdm.ContractLine + COUNT(*) FROM cdm.Entitlement + COUNT(*) FROM cdm.EntitlementContact + COUNT(*) FROM cdm.EntitlementProduct + COUNT(*) FROM cdm.[Case] + COUNT(*) FROM cdm.ServiceActivity + COUNT(*) FROM cdm.ActivityParty + COUNT(*) FROM cdm.Task + COUNT(*) FROM cdm.KnowledgeArticle + COUNT(*) FROM cdm.KnowledgeArticleIncident + COUNT(*) FROM cdm.SLAKPIInstance + COUNT(*) FROM cdm.CaseResolution + COUNT(*) FROM cdm.ServiceContractContact ); SELECT 'Total Records Inserted' AS Metric, @TotalRecords AS Value UNION ALL SELECT 'Average Records per Case', (SELECT COUNT(*) FROM cdm.ServiceActivity) / (SELECT COUNT(*) FROM cdm.[Case]) UNION ALL SELECT 'Average Cases per Account', (SELECT COUNT(*) FROM cdm.[Case]) / (SELECT COUNT(*) FROM cdm.Account) UNION ALL SELECT 'Average Contract Lines', (SELECT COUNT(*) FROM cdm.ContractLine) / (SELECT COUNT(*) FROM cdm.Contract); PRINT ''; PRINT 'Date Range: ' + CAST(@StartDate AS VARCHAR(10)) + ' to ' + CAST(@EndDate AS VARCHAR(10)); PRINT ''; PRINT 'All data has been generated successfully!'; PRINT '========================================'; GO