Sql server 2008 如何生成一个脚本,将varchar列更改为xml类型,并转换数据?
最初我有一个Sql server 2008 如何生成一个脚本,将varchar列更改为xml类型,并转换数据?,sql-server-2008,Sql Server 2008,最初我有一个varchar类型的专栏(partner\u email)。现在有一个最新的更改,需要将其更改为XML数据类型,但需要将现有行转换为新列 需要帮助逐步浏览脚本将有助于了解问题: 脚本1 使用测试数据库 如果合作伙伴中不存在列partner\u email\u temp 表中,以XML列的形式添加partner\u email\u temp 更新合作伙伴表。将partner\u email\u temp的值更改为 成为合作伙伴电子邮件的XML友好字符串版本。然后将其转换为XML。使用“
varchar
类型的专栏(partner\u email
)。现在有一个最新的更改,需要将其更改为XML
数据类型,但需要将现有行转换为新列
需要帮助逐步浏览脚本将有助于了解问题: 脚本1
partner\u email\u temp
表中,以XML列的形式添加partner\u email\u temp
partner\u email\u temp
的值更改为
成为合作伙伴电子邮件的XML友好字符串版本。然后将其转换为XML。使用“替换”将所有和转换为编码的和partner\u email
partner\u email\u temp
重命名为partner\u email
partner\u email\u temp
列不存在(在第一次运行时已重命名为partner\u email)
现在,在步骤3中,您正试图再次更新partner\u email
列。问题是此列现在是XML数据类型,使用REPLACE
是非法的。所以SQLServer抛出了一个错误
脚本2
合作伙伴电子邮件列的列数据类型
搭档
partner\u email\u temp
不存在,请添加
partner\u email\u temp
列作为XMLPartner\u email\u temp
成为合作伙伴电子邮件的XML友好字符串版本,然后
将其转换为XML。使用REPLACE
将所有和转换为编码的和partner\u email
partner\u email\u temp
重命名为partner\u email
GO
语句
根据:
SQL Server实用程序将GO解释为它们应该发送的信号
SQL实例的当前Transact-SQL语句批
服务器
因此,在脚本2中,当SQL Server尝试编译时,它会注意到,partner\u email\u temp
列不存在。它在脚本1中工作,因为这些部分是单独执行的。当引用partner\u email\u temp
的部分被执行时,该列确实存在
那么你如何修复它呢
如果您只需将partner\u email
列中的数据更新为正确的格式,然后将该列转换为XML数据类型,实际上就可以绕过所有列的删除和重命名。这可以在一个SQL批处理语句中实现,但您需要将其作为动态SQL执行,以便SQL Server仅在partner\u email列
为varchar数据类型时尝试执行REPLACE
语句:
IF NOT EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.columns
WHERE table_name = 'Partner'
AND column_name = 'partner_email'
AND data_type = 'xml'
)
BEGIN
DECLARE @sqlCmd NVARCHAR(4000)
SET @sqlCmd = N'
UPDATE [dbo].[Partner]
SET partner_email = ''<PartnerEmails><Email>''
+ REPLACE(partner_email, ''&'', ''&'')
+ ''</Email><Email></Email><Email></Email></PartnerEmails>'';
ALTER TABLE Partner ALTER Column partner_email XML
'
EXEC (@sqlCmd)
END
如果不存在
(
选择*
从信息_SCHEMA.columns
其中,表_name='Partner'
和列名称='合作伙伴电子邮件'
和数据类型='xml'
)
开始
声明@sqlCmd NVARCHAR(4000)
设置@sqlCmd=N'
更新[dbo].[Partner]
设置合作伙伴的电子邮件=“”“
+替换(合作伙伴的电子邮件,''&'',''&;'')
+ '''';
ALTER表格合作伙伴ALTER列合作伙伴\u电子邮件XML
'
EXEC(@sqlCmd)
结束
逐步浏览脚本将有助于了解问题:
脚本1
partner\u email\u temp
表中,以XML列的形式添加partner\u email\u temp
partner\u email\u temp
的值更改为
成为合作伙伴电子邮件的XML友好字符串版本。然后将其转换为XML。使用“替换”将所有和转换为编码的和partner\u email
partner\u email\u temp
重命名为partner\u email
partner\u email\u temp
列不存在(在第一次运行时已重命名为partner\u email)
现在,在步骤3中,您正试图再次更新partner\u email
列。问题是此列现在是XML数据类型,使用REPLACE
是非法的。所以SQLServer抛出了一个错误
脚本2
合作伙伴电子邮件列的列数据类型
搭档
partner\u email\u temp
不存在,请添加
partner\u email\u temp
列作为XMLPartner\u email\u temp
成为合作伙伴电子邮件的XML友好字符串版本,然后
将其转换为XML。使用REPLACE
将所有和转换为编码的和partner\u email
partner\u email\u temp
重命名为partner\u email
GO
语句
根据:
SQL Server实用程序interp