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中删除列
    partner\u email
  • 将列
    partner\u email\u temp
    重命名为
    partner\u email
  • 所有这些都是第一次起作用。第二次运行脚本时,SQL Server将进入步骤2并再次执行ALTER TABLE语句。这是因为
    partner\u email\u temp
    列不存在(在第一次运行时已重命名为partner\u email)

    现在,在步骤3中,您正试图再次更新
    partner\u email
    列。问题是此列现在是XML数据类型,使用
    REPLACE
    是非法的。所以SQLServer抛出了一个错误

    脚本2

  • 捕获中
    合作伙伴电子邮件
    列的列数据类型
    搭档
  • 如果列数据类型为varchar(意味着这是第一次传递 在开始和结束时执行代码
  • 如果列
    partner\u email\u temp
    不存在,请添加
    partner\u email\u temp
    列作为XML
  • 通过更改
    Partner\u email\u temp
    成为合作伙伴电子邮件的XML友好字符串版本,然后 将其转换为XML。使用
    REPLACE
    将所有和转换为编码的和
  • 从partner中删除列
    partner\u email
  • 将列
    partner\u email\u temp
    重命名为
    partner\u email
  • 第二个脚本中的问题是不能在BEGIN和END语句中使用
    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, ''&'', ''&amp;'') 
      + ''</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中删除列
    partner\u email
  • 将列
    partner\u email\u temp
    重命名为
    partner\u email
  • 所有这些都是第一次起作用。第二次运行脚本时,SQL Server将进入步骤2并再次执行ALTER TABLE语句。这是因为
    partner\u email\u temp
    列不存在(在第一次运行时已重命名为partner\u email)

    现在,在步骤3中,您正试图再次更新
    partner\u email
    列。问题是此列现在是XML数据类型,使用
    REPLACE
    是非法的。所以SQLServer抛出了一个错误

    脚本2

  • 捕获中
    合作伙伴电子邮件
    列的列数据类型
    搭档
  • 如果列数据类型为varchar(意味着这是第一次传递 在开始和结束时执行代码
  • 如果列
    partner\u email\u temp
    不存在,请添加
    partner\u email\u temp
    列作为XML
  • 通过更改
    Partner\u email\u temp
    成为合作伙伴电子邮件的XML友好字符串版本,然后 将其转换为XML。使用
    REPLACE
    将所有和转换为编码的和
  • 从partner中删除列
    partner\u email
  • 将列
    partner\u email\u temp
    重命名为
    partner\u email
  • 第二个脚本中的问题是不能在BEGIN和END语句中使用
    GO
    语句

    根据:

    SQL Server实用程序interp