-- ============================================================================ -- MODIFIED SCRIPT: Contact Import with Corrected Column Mapping -- ============================================================================ -- Changes: -- 1. Fixed encoding for comments (readable Russian text) -- 2. Added splitting logic for "Company - Department" field -- 3. Corrected duplicate field handling (Last Name, First Name) -- 4. Improved mapping between CSV columns and database columns -- 5. Added complete script structure (delete old contacts, backup, import) -- ============================================================================ -- ============================================================================ -- SECTION 1: BEGIN TRANSACTION -- ============================================================================ BEGIN TRAN T1; -- ============================================================================ -- SECTION 2: CLEANUP - Delete old backup data -- ============================================================================ DELETE FROM dbo.tContactsInGroupsDeleted DELETE FROM dbo.tContactsPlainDeleted -- Optional: Uncomment to delete all contacts and groups (DESTRUCTIVE!) -- DELETE FROM dbo.tContactsInGroups -- DELETE FROM dbo.tContactsPlain -- DELETE FROM dbo.tGroups -- ============================================================================ -- SECTION 3: IDENTIFY CONTACTS TO DELETE -- ============================================================================ -- Delete contacts that are not in specific groups (or all contacts) DECLARE @deleteContacts AS TABLE(contactId INT) INSERT INTO @deleteContacts(contactId) SELECT tContactsPlain.id FROM tContactsPlain -- Uncomment and modify WHERE clause to filter contacts by group: -- LEFT JOIN tContactsInGroups ON tContactsPlain.id = tContactsInGroups.contactId -- LEFT JOIN tGroups ON tContactsInGroups.[groupId] = tGroups.id -- WHERE ISNULL(tGroups.[name],'') NOT IN ('test2') -- ============================================================================ -- SECTION 4: BACKUP CONTACTS TO DELETE -- ============================================================================ -- Backup contacts to tContactsPlainDeleted SET IDENTITY_INSERT [dbo].[tContactsPlainDeleted] ON INSERT INTO tContactsPlainDeleted ( [id], [ssuID], [lastRequestDate], [lastUpdateDate], [isEnabled], [email1], [requestNow], [UserProfileDisplay], [businessPhone], [businessPhone2], [mobilePhone], [otherPhone], [pager], [radioPhone], [homePhone], [homePhone2], [businessAddressCity], [businessAddressCountry], [businessAddressPostalCode], [businessAddressState], [businessAddressStreet], [homeAddressCity], [homeAddressCountry], [homeAddressPostalCode], [homeAddressState], [homeAddressStreet], [otherAddressCity], [otherAddressCountry], [otherAddressPostalCode], [otherAddressState], [otherAddressStreet], [businessFax], [homeFax], [otherFax], [company], [department], [email2], [email3], [firstName], [lastName], [middleName], [jobTitle], [managerName], [office], [suffix], [spouse], [anniversary], [userField1], [userField2], [userField3], [userField4], [assistantName], [notes], [birthday], [webPage], [personalHomePage], [businessHomePage], [assistantPhone], [callbackPhone], [carPhone], [companyMainPhone], [children], [hobbies], [iMAddress], [iSDN], [language], [nickname], [primaryPhone], [profession], [telex], [ttyTddPhone], [displayName], [fileAs], [uniqueID], [lastEditedDate], [ssuLastRequest], [ssuDisabled], [ssuRequestNow], [ssuExpireID], [ssuLastUpdate], [SSU_DepartmentCode], [SSU_LocationCode], [customICE], [SSU_DepartmentID], [SSU_LocationID], [SSU_ManagerSsuId], [hasPicture], [customEscalation], [displayNamePrefix], [SSU_CompanyID], [SSU_JobTitleID], [SSU_TitleID], [SSU_UserField2ID], [SSU_UserField3ID], [SSU_UserField4ID], [userCertificate], [Category], [initials], [postalAddressId], [mailingAddressStreet], [mailingAddressCity], [mailingAddressState], [mailingAddressPostalCode], [mailingAddressCountry], [mailingAddress], [SSU_UserField1ID], [SSU_UserField5ID], [SSU_UserField6ID], [SSU_UserField7ID], [SSU_UserField8ID], [SSU_ProfessionID], [userField5], [userField6], [userField7], [userField8], [email1DisplayName], [hasAttach] ) SELECT [id], [ssuID], [lastRequestDate], [lastUpdateDate], [isEnabled], [email1], [requestNow], [UserProfileDisplay], [businessPhone], [businessPhone2], [mobilePhone], [otherPhone], [pager], [radioPhone], [homePhone], [homePhone2], [businessAddressCity], [businessAddressCountry], [businessAddressPostalCode], [businessAddressState], [businessAddressStreet], [homeAddressCity], [homeAddressCountry], [homeAddressPostalCode], [homeAddressState], [homeAddressStreet], [otherAddressCity], [otherAddressCountry], [otherAddressPostalCode], [otherAddressState], [otherAddressStreet], [businessFax], [homeFax], [otherFax], [company], [department], [email2], [email3], [firstName], [lastName], [middleName], [jobTitle], [managerName], [office], [suffix], [spouse], [anniversary], [userField1], [userField2], [userField3], [userField4], [assistantName], [notes], [birthday], [webPage], [personalHomePage], [businessHomePage], [assistantPhone], [callbackPhone], [carPhone], [companyMainPhone], [children], [hobbies], [iMAddress], [iSDN], [language], [nickname], [primaryPhone], [profession], [telex], [ttyTddPhone], [displayName], [fileAs], [uniqueID], [lastEditedDate], [ssuLastRequest], [ssuDisabled], [ssuRequestNow], [ssuExpireID], [ssuLastUpdate], [SSU_DepartmentCode], [SSU_LocationCode], [customICE], [SSU_DepartmentID], [SSU_LocationID], [SSU_ManagerSsuId], [hasPicture], [customEscalation], [displayNamePrefix], [SSU_CompanyID], [SSU_JobTitleID], [SSU_TitleID], [SSU_UserField2ID], [SSU_UserField3ID], [SSU_UserField4ID], [userCertificate], [Category], [initials], [postalAddressId], [mailingAddressStreet], [mailingAddressCity], [mailingAddressState], [mailingAddressPostalCode], [mailingAddressCountry], [mailingAddress], [SSU_UserField1ID], [SSU_UserField5ID], [SSU_UserField6ID], [SSU_UserField7ID], [SSU_UserField8ID], [SSU_ProfessionID], [userField5], [userField6], [userField7], [userField8], [email1DisplayName], [hasAttach] FROM tContactsPlain WHERE id IN (SELECT contactId FROM @deleteContacts) SET IDENTITY_INSERT [dbo].[tContactsPlainDeleted] OFF -- ============================================================================ -- SECTION 5: BACKUP CONTACT-GROUP RELATIONSHIPS -- ============================================================================ SET IDENTITY_INSERT [dbo].[tContactsInGroupsDeleted] ON INSERT INTO tContactsInGroupsDeleted ([id], [groupId], [contactId]) SELECT [id], [groupId], [contactId] FROM tContactsInGroups WHERE contactId IN (SELECT contactId FROM @deleteContacts) SET IDENTITY_INSERT [dbo].[tContactsInGroupsDeleted] OFF -- ============================================================================ -- SECTION 6: DELETE CONTACTS AND RELATIONSHIPS -- ============================================================================ DELETE FROM tContactsInGroups WHERE contactId IN (SELECT contactId FROM @deleteContacts) DELETE FROM tContactsPlain WHERE id IN (SELECT contactId FROM @deleteContacts) -- ============================================================================ -- SECTION 7: CREATE TEMP TABLE FOR CSV IMPORT -- ============================================================================ CREATE TABLE #contacts ( -- Status and Identity Fields [Status] VARCHAR(MAX), [First Name] VARCHAR(MAX), [Last Name] VARCHAR(MAX), [Email1] VARCHAR(MAX), -- Timestamp Fields [Last Update] VARCHAR(MAX), [Last Request] VARCHAR(MAX), [Next Request] VARCHAR(MAX), -- Grouping and Display Fields [Groups] VARCHAR(MAX), [UserProfileDisplay] VARCHAR(MAX), [ICE] VARCHAR(MAX), [Category] VARCHAR(MAX), -- Location and Identification [Location Code] VARCHAR(MAX), [SSU Id] VARCHAR(MAX), [uniqueID] VARCHAR(MAX), -- Duplicate Name Fields (for compatibility) [Last Name Dup] VARCHAR(MAX), [First Name Dup] VARCHAR(MAX), -- Professional Information [Title] VARCHAR(MAX), [Company - Department] VARCHAR(MAX), -- MODIFIED: Combined field to be split [Email] VARCHAR(MAX), -- Phone Numbers [Primary Direct Phone (no extensions)] VARCHAR(MAX), [Mobile Phone] VARCHAR(MAX), [Home Phone] VARCHAR(MAX), [Alternate Phone Number] VARCHAR(MAX), [Business Fax] VARCHAR(MAX), -- Business Address [Business City] VARCHAR(MAX), [Business Country] VARCHAR(MAX), [Business Zip Code] VARCHAR(MAX), [Business State] VARCHAR(MAX), [Business Street] VARCHAR(MAX), -- Escalation and Notes [Escalation Level (EOC Use)] VARCHAR(MAX), [Notes (EOC Use)] VARCHAR(MAX) ) -- ============================================================================ -- SECTION 8: BULK INSERT FROM CSV FILE -- ============================================================================ -- NOTE: Update file path to match your CSV file location BULK INSERT #contacts FROM 'C:\temp\Itrezzo0929.csv' WITH ( FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', TABLOCK, KEEPNULLS, -- Treat empty fields as NULLs ERRORFILE = 'C:\temp\myRubbishData.log' ) -- ============================================================================ -- SECTION 9: DECLARE VARIABLES FOR CONTACT PROCESSING -- ============================================================================ -- Declare variables for all CSV columns (32 fields from import file) DECLARE @Status VARCHAR(MAX), -- NOTE: Not mapped to DB (status column does not exist in tContactsPlain) @FirstName VARCHAR(MAX), @LastName VARCHAR(MAX), @Email1 VARCHAR(MAX), @LastUpdate VARCHAR(MAX), -- NOTE: Excluded from DB operations @LastRequest VARCHAR(MAX), -- NOTE: Excluded from DB operations @NextRequest VARCHAR(MAX), -- NOTE: Excluded from DB operations @Groups VARCHAR(MAX), @UserProfileDisplay VARCHAR(MAX), @ICE VARCHAR(MAX), @Category VARCHAR(MAX), @LocationCode VARCHAR(MAX), -- NOTE: Not mapped to DB (locationCode column does not exist in tContactsPlain) @SSUId VARCHAR(MAX), @UniqueID VARCHAR(MAX), @LastNameDup VARCHAR(MAX), -- Duplicate field (position 15) @FirstNameDup VARCHAR(MAX), -- Duplicate field (position 16) @Title VARCHAR(MAX), @CompanyDepartment VARCHAR(MAX), -- CHANGED: Combined field from CSV "Company - Department" @Email VARCHAR(MAX), @PrimaryDirectPhone VARCHAR(MAX), @MobilePhone VARCHAR(MAX), @HomePhone VARCHAR(MAX), @AlternatePhoneNumber VARCHAR(MAX), @BusinessFax VARCHAR(MAX), @BusinessCity VARCHAR(MAX), @BusinessCountry VARCHAR(MAX), @BusinessZipCode VARCHAR(MAX), @BusinessState VARCHAR(MAX), @BusinessStreet VARCHAR(MAX), @EscalationLevel VARCHAR(MAX), @Notes VARCHAR(MAX), -- NEW: Separate variables for parsed Company and Department @Company VARCHAR(MAX), @Department VARCHAR(MAX), @contactId INT, @groupId INT, @contactGroupId INT -- ============================================================================ -- CURSOR: Process all contacts from #contacts temp table -- ============================================================================ DECLARE contacts_cursor CURSOR FOR SELECT [Status], -- Column 1 [First Name], -- Column 2 [Last Name], -- Column 3 [Email1], -- Column 4 [Last Update], -- Column 5 (excluded from DB operations) [Last Request], -- Column 6 (excluded from DB operations) [Next Request], -- Column 7 (excluded from DB operations) [Groups], -- Column 8 [UserProfileDisplay], -- Column 9 [ICE], -- Column 10 [Category], -- Column 11 [Location Code], -- Column 12 [SSU Id], -- Column 13 [uniqueID], -- Column 14 [Last Name], -- Column 15 (duplicate) [First Name], -- Column 16 (duplicate) [Title], -- Column 17 [Company - Department], -- Column 18 (CHANGED: combined field) [Email], -- Column 19 [Primary Direct Phone (no extensions)],-- Column 20 [Mobile Phone], -- Column 21 [Home Phone], -- Column 22 [Alternate Phone Number], -- Column 23 [Business Fax], -- Column 24 [Business City], -- Column 25 [Business Country], -- Column 26 [Business Zip Code], -- Column 27 [Business State], -- Column 28 [Business Street], -- Column 29 [Escalation Level (EOC Use)], -- Column 30 [Notes (EOC Use)] -- Column 31 FROM #contacts OPEN contacts_cursor FETCH NEXT FROM contacts_cursor INTO @Status, @FirstName, @LastName, @Email1, @LastUpdate, @LastRequest, @NextRequest, @Groups, @UserProfileDisplay, @ICE, @Category, @LocationCode, @SSUId, @UniqueID, @LastNameDup, @FirstNameDup, -- Duplicate fields @Title, @CompanyDepartment, @Email, -- CHANGED: @CompanyDepartment instead of @Company @PrimaryDirectPhone, @MobilePhone, @HomePhone, @AlternatePhoneNumber, @BusinessFax, @BusinessCity, @BusinessCountry, @BusinessZipCode, @BusinessState, @BusinessStreet, @EscalationLevel, @Notes WHILE @@FETCH_STATUS = 0 BEGIN -- ======================================================================== -- STEP 1: Determine External User Status -- ======================================================================== -- Check if uniqueId starts with 'external' to set @ExternalUsers DECLARE @ExternalUsers INT SET @ExternalUsers = CASE WHEN @UniqueID LIKE 'external%' THEN 2 ELSE NULL END -- ======================================================================== -- STEP 2: Split "Company - Department" field -- ======================================================================== -- Parse combined "Company - Department" field into separate variables DECLARE @DashPosition INT SET @DashPosition = CHARINDEX(' - ', @CompanyDepartment) IF @DashPosition > 0 BEGIN -- Split by " - " delimiter SET @Company = LTRIM(RTRIM(SUBSTRING(@CompanyDepartment, 1, @DashPosition - 1))) SET @Department = LTRIM(RTRIM(SUBSTRING(@CompanyDepartment, @DashPosition + 3, LEN(@CompanyDepartment)))) END ELSE BEGIN -- No delimiter found - treat entire string as Company SET @Company = LTRIM(RTRIM(@CompanyDepartment)) SET @Department = NULL END -- ======================================================================== -- STEP 3: Clean quote characters from all fields -- ======================================================================== SET @LastName = REPLACE(@LastName, '"', '') SET @FirstName = REPLACE(@FirstName, '"', '') SET @Email1 = REPLACE(@Email1, '"', '') SET @Email = REPLACE(@Email, '"', '') SET @Company = REPLACE(@Company, '"', '') SET @Department = REPLACE(ISNULL(@Department, ''), '"', '') SET @Title = REPLACE(@Title, '"', '') SET @PrimaryDirectPhone = REPLACE(@PrimaryDirectPhone, '"', '') SET @MobilePhone = REPLACE(@MobilePhone, '"', '') SET @HomePhone = REPLACE(@HomePhone, '"', '') SET @AlternatePhoneNumber = REPLACE(@AlternatePhoneNumber, '"', '') SET @BusinessFax = REPLACE(@BusinessFax, '"', '') SET @BusinessCity = REPLACE(@BusinessCity, '"', '') SET @BusinessCountry = REPLACE(@BusinessCountry, '"', '') SET @BusinessZipCode = REPLACE(@BusinessZipCode, '"', '') SET @BusinessState = REPLACE(@BusinessState, '"', '') SET @BusinessStreet = REPLACE(@BusinessStreet, '"', '') SET @UserProfileDisplay = REPLACE(@UserProfileDisplay, '"', '') SET @LocationCode = REPLACE(@LocationCode, '"', '') SET @Category = REPLACE(@Category, '"', '') -- ======================================================================== -- STEP 4: Clean Notes field (remove trailing/leading commas) -- ======================================================================== IF @Notes = ',' BEGIN SET @Notes = NULL END DECLARE @notesTrim VARCHAR(MAX) SET @notesTrim = RTRIM(LTRIM(@Notes)) IF SUBSTRING(@notesTrim, LEN(@notesTrim), 1) = ',' BEGIN SET @notesTrim = SUBSTRING(@notesTrim, 1, LEN(@notesTrim) - 1) END IF LEN(@notesTrim) > 0 AND SUBSTRING(@notesTrim, 1, 1) = ',' BEGIN SET @notesTrim = SUBSTRING(@notesTrim, 2, LEN(@notesTrim)) END SET @Notes = @notesTrim -- ======================================================================== -- STEP 5: Use Email1 as primary email for contact lookup -- ======================================================================== DECLARE @email_lookup VARCHAR(MAX) SET @email_lookup = @Email1 -- ======================================================================== -- STEP 6: Find existing contact by email -- ======================================================================== SET @contactId = (SELECT TOP 1 id FROM tContactsPlain WHERE email1 = @email_lookup) -- ======================================================================== -- STEP 7: INSERT new contact if not exists -- ======================================================================== IF @contactId IS NULL AND LEN(@email_lookup) > 0 AND @email_lookup <> 'N/A' AND @email_lookup <> 'n/a' AND CHARINDEX('@', @email_lookup) > 0 BEGIN INSERT INTO tContactsPlain ( email1, firstName, lastName, jobTitle, company, department, businessPhone, mobilePhone, homePhone, businessPhone2, businessFax, businessAddressCity, businessAddressCountry, businessAddressPostalCode, businessAddressState, businessAddressStreet, customEscalation, notes, ssuID, isEnabled, requestNow, userProfileDisplay, category, customICE, uniqueId ) VALUES ( @email_lookup, @FirstName, @LastName, @Title, @Company, @Department, @PrimaryDirectPhone, @MobilePhone, @HomePhone, @AlternatePhoneNumber, @BusinessFax, @BusinessCity, @BusinessCountry, @BusinessZipCode, @BusinessState, @BusinessStreet, @EscalationLevel, @Notes, COALESCE(@SSUId, 'external' + LOWER(REPLACE(NEWID(), '-', ''))), 1, 0, @ExternalUsers, @Category, @ICE, @UniqueID ) SET @contactId = (SELECT SCOPE_IDENTITY()) END -- ======================================================================== -- STEP 8: UPDATE existing contact -- ======================================================================== ELSE IF @contactId IS NOT NULL BEGIN UPDATE tContactsPlain SET firstName = ISNULL(@FirstName, firstName), lastName = ISNULL(@LastName, lastName), jobTitle = ISNULL(@Title, jobTitle), company = ISNULL(@Company, company), department = ISNULL(@Department, department), businessPhone = ISNULL(@PrimaryDirectPhone, businessPhone), mobilePhone = ISNULL(@MobilePhone, mobilePhone), homePhone = ISNULL(@HomePhone, homePhone), businessPhone2 = ISNULL(@AlternatePhoneNumber, businessPhone2), businessFax = ISNULL(@BusinessFax, businessFax), businessAddressCity = ISNULL(@BusinessCity, businessAddressCity), businessAddressCountry = ISNULL(@BusinessCountry, businessAddressCountry), businessAddressPostalCode = ISNULL(@BusinessZipCode, businessAddressPostalCode), businessAddressState = ISNULL(@BusinessState, businessAddressState), businessAddressStreet = ISNULL(@BusinessStreet, businessAddressStreet), customEscalation = ISNULL(@EscalationLevel, customEscalation), notes = ISNULL(@Notes, notes), -- Update additional fields (REMOVED: locationCode, status - not in table schema) userProfileDisplay = ISNULL(@ExternalUsers, userProfileDisplay), category = ISNULL(@Category, category), customICE = ISNULL(@ICE, customICE), uniqueId = ISNULL(@UniqueID, uniqueId) WHERE id = @contactId END -- ======================================================================== -- STEP 9: Process Groups (semicolon-separated list) -- ======================================================================== IF @Groups IS NOT NULL AND LEN(@Groups) > 0 BEGIN DECLARE @group VARCHAR(MAX) DECLARE groups_cursor CURSOR FOR SELECT [value] FROM STRING_SPLIT(@Groups, ';') WHERE [value] IS NOT NULL AND LEN(TRIM([value])) > 0 OPEN groups_cursor FETCH NEXT FROM groups_cursor INTO @group WHILE @@FETCH_STATUS = 0 BEGIN SET @group = RTRIM(LTRIM(@group)) IF @contactId IS NOT NULL AND @group IS NOT NULL AND LEN(@group) > 0 BEGIN SET @groupId = (SELECT id FROM tGroups WHERE [name] = @group) IF @groupId IS NULL BEGIN INSERT INTO tGroups ([name], entryId) VALUES (@group, NEWID()) SET @groupId = (SELECT SCOPE_IDENTITY()) END -- Link contact to group IF @groupId IS NOT NULL BEGIN SET @contactGroupId = (SELECT id FROM tContactsInGroups WHERE contactId = @contactId AND groupId = @groupId) IF @contactGroupId IS NULL BEGIN INSERT INTO tContactsInGroups (groupId, contactId) VALUES (@groupId, @contactId) END END END FETCH NEXT FROM groups_cursor INTO @group END CLOSE groups_cursor; DEALLOCATE groups_cursor; END -- ======================================================================== -- STEP 10: Fetch next contact -- ======================================================================== FETCH NEXT FROM contacts_cursor INTO @Status, @FirstName, @LastName, @Email1, @LastUpdate, @LastRequest, @NextRequest, @Groups, @UserProfileDisplay, @ICE, @Category, @LocationCode, @SSUId, @UniqueID, @LastNameDup, @FirstNameDup, -- Duplicate fields @Title, @CompanyDepartment, @Email, -- CHANGED: @CompanyDepartment @PrimaryDirectPhone, @MobilePhone, @HomePhone, @AlternatePhoneNumber, @BusinessFax, @BusinessCity, @BusinessCountry, @BusinessZipCode, @BusinessState, @BusinessStreet, @EscalationLevel, @Notes END CLOSE contacts_cursor; DEALLOCATE contacts_cursor; -- ============================================================================ -- SECTION 10: COMMIT TRANSACTION -- ============================================================================ COMMIT TRAN T1; -- ============================================================================ -- SECTION 11: CLEANUP TEMP TABLE -- ============================================================================ IF OBJECT_ID('tempdb..#contacts') IS NOT NULL DROP TABLE #contacts -- ============================================================================ -- FINAL: Print completion message -- ============================================================================ PRINT 'Contact import completed successfully' PRINT 'Note: lastUpdate, lastRequest, nextRequest fields are excluded from database operations' PRINT 'Note: Company - Department field has been split into separate Company and Department columns' PRINT 'Note: Status and Location Code fields are not stored (columns do not exist in table)' -- ============================================================================ -- END OF SCRIPT -- ============================================================================ GO