Initially I have a column (partner_email) of varchar.Now a recent change has come where it needs to be changed to be changed to the XML type but the previous records needs to be reserve into the new column. I have applied the below algorithm to accomplish the work
/***********************************************************************
Purpose:
To change the partner_email column from Varchar Type To Xml Type and convert the
existing records from varchar to xml types.
Programmers Notes:
1. Create a new Column by the name partner_email_temp of type XML into the Partner Table
2. Copy the Email contents from partner_email to partner_email_temp column after
proper conversion
N.B.~ The format will be
<PartnerEmails>
<Email>
[email protected]</Email>
<Email />
<Email />
</PartnerEmails>
3. Drop the exisitng partner_email
4. Rename partner_email_temp column to partner_email
***********************************************************************/
USE [Test]
GO
--===== Create a partner_email_temp column of type xml into the Partner table
IF NOT EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.columns
WHERE table_name = 'Partner'
AND column_name = 'partner_email_temp'
)
BEGIN
ALTER TABLE [dbo].[Partner] ADD partner_email_temp XML NULL
END
GO
--===== Copy the Email contents from partner_email to partner_email_temp column
-- after
proper conversion to xml type
UPDATE [dbo].[Partner]
SET partner_email_temp = CAST('<PartnerEmails><Email>' + REPLACE(partner_email, '&', '&') + '</Email><Email></Email><Email></Email></PartnerEmails>' AS XML)
GO
--===== Drop the exisitng partner_email
ALTER TABLE [dbo].[Partner]
DROP COLUMN partner_email
GO
--===== Rename partner_email_temp column to partner_email
Exec sp_RENAME 'Partner.partner_email_temp','partner_email','COLUMN'
GO
I works fine for the first time I ran. Now if I ran it for the next time, it am getting an error
Msg 8116, Level 16, State 1, Line 4
Argument data type xml is invalid for argument 1 of replace function.
Caution: Changing any part of an object name could break scripts and stored procedures.
The intention is that, if the partner_email column is varchar, the script will change it to xml type and will convert all the data in xml format . If I ran it second time, it should ignore the statement.
How to achieve this?
I am trying in a different way
DECLARE @columnDataType VARCHAR(50)
SELECT @columnDataType = DATA_TYPE
FROM INFORMATION_SCHEMA.columns
WHERE table_name = 'Partner'
AND column_name = 'partner_email'
print @columnDataType
IF (@columnDataType = 'varchar')
BEGIN
--===== Create a partner_email_temp column of type xml into the Partner table
IF NOT EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.columns
WHERE table_name = 'Partner'
AND column_name = 'partner_email_temp'
)
BEGIN
ALTER TABLE [dbo].[Partner] ADD partner_email_temp XML NULL
--===== Copy the Email contents from partner_email to partner_email_temp column
-- after
proper conversion to xml type
UPDATE [dbo].[Partner]
SET partner_email_temp = CAST('<PartnerEmails><Email>' + REPLACE(partner_email, '&', '&') + '</Email><Email></Email><Email></Email></PartnerEmails>' AS XML)
--===== Drop the exisitng partner_email
ALTER TABLE [dbo].[Partner]
DROP COLUMN partner_email
--===== Rename partner_email_temp column to partner_email
EXEC sp_RENAME 'Partner.partner_email_temp','partner_email','COLUMN'
END
END
but getting error
Msg 207, Level 16, State 1, Line 29
Invalid column name 'partner_email_temp'.
Help needed