【问题标题】:XML declaration with "FOR XML PATH" in SQL Server 2005SQL Server 2005 中带有“FOR XML PATH”的 XML 声明
【发布时间】:2011-01-08 00:11:47
【问题描述】:

下面是我已经创建的查询的简化版本。查询工作正常,但我不知道如何在生成的 XML 顶部获取 XML 声明。我尝试了多种方法并在 Google 上进行了广泛的搜索,但可惜我似乎无法找到如何做到这一点......或者即使有可能。

select 
    'Dimension' "@type",
    (
        select
            (
                select
                    'X102' "TransactionType",
                    convert(varchar, getdate(), 104) "Transfer/TransferDate",
                    convert(varchar, getdate(), 108) "Transfer/TransferTime"
                for xml path (''), type
            ) "TransactionInformation"
        for xml path (''), type
    )
for xml path ('DimensionImport'), type

给我...

<DimensionImport type="Dimension">
    <TransactionInformation>
        <TransactionType>X102</TransactionType>
        <Transfer>
            <TransferDate>21.01.2010</TransferDate>
            <TransferTime>15:46:36</TransferTime>
        </Transfer>
    </TransactionInformation>
</DimensionImport>

我想要...

<?xml version="1.0" encoding="ISO-8859-1" ?>
<DimensionImport type="Dimension">
    <TransactionInformation>
        <TransactionType>X102</TransactionType>
        <Transfer>
            <TransferDate>21.01.2010</TransferDate>
            <TransferTime>15:46:36</TransferTime>
        </Transfer>
    </TransactionInformation>
</DimensionImport>

提前感谢您提供的任何帮助。

【问题讨论】:

标签: sql xml sql-server-2005 for-xml-path


【解决方案1】:

在EM的2008 R2中,如果打开“另存为”并展开“保存”按钮,则可以保存巫婆编码,然后自动添加xml声明。

希望对您有所帮助。 问候。

【讨论】:

    【解决方案2】:

    这就是我最终要做的事情。数据类型不作为 XML 数据类型返回,但我猜我可以处理。

    select '<?xml version="1.0" encoding="ISO-8859-1" ?>' +
    (
        select 
            'Dimension' "@type",
            (
                select
                    (
                        select
                            'X102' "TransactionType",
                            convert(varchar, getdate(), 104) "Transfer/TransferDate",
                            convert(varchar, getdate(), 108) "Transfer/TransferTime"
                        for xml path (''), type
                    )
                for xml path ('TransactionInformation'), type
            ),
            (
                ... queried up data here ...
            )
        for xml path ('DimensionImport')
    )
    

    【讨论】:

      【解决方案3】:

      不幸的是,这是我在SQL Server Books Online 中发现的:

      当实例存储在数据库中时,不会保留实例中的 XML 声明 PI。例如:

      Copy Code CREATE TABLE T1 (Col1 int primary key, Col2 xml)
      GO
      INSERT INTO T1 values (1, '<?xml version="1.0" encoding="windows-1252" ?><doc></doc>')
      GO
      SELECT Col2
      FROM T1
      

      结果是&lt;doc/&gt;

      唯一的解决方法是将 XML 作为 varchar(max) 类型返回:

      select '<?xml version="1.0" encoding="ISO-8859-1" ?>'
      +
      cast( (
      select 
          'Dimension' "@type",
          (
              select
                  (
                      select
                          'X102' "TransactionType",
                          convert(varchar, getdate(), 104) "Transfer/TransferDate",
                          convert(varchar, getdate(), 108) "Transfer/TransferTime"
                      for xml path (''), type
                  ) "TransactionInformation"
              for xml path (''), type
          )
      for xml path ('DimensionImport'), type) as varchar(max))
      

      【讨论】:

      • 这基本上就是我最终所做的。谢谢。
      【解决方案4】:

      试试这个:

      select '<?xml version="1.0" encoding="ISO-8859-1" ?>' + 
             (your whole upper select here)
      

      【讨论】:

      • 返回错误:数据类型varchar和xml在add运算符中不兼容。
      【解决方案5】:

      它很乱,但你可以将它连接在前面......

      SELECT '<? xml...>' + 
      (select 
          'Dimension' "@type",
          (
              select
                  (
                      select
                          'X102' "TransactionType",
                          convert(varchar, getdate(), 104) "Transfer/TransferDate",
                          convert(varchar, getdate(), 108) "Transfer/TransferTime"
                      for xml path (''), type
                  ) "TransactionInformation"
              for xml path (''), type
          )
      for xml path ('DimensionImport'), type)
      

      【讨论】:

      • 唉,那没用。返回错误:数据类型 varchar 和 xml 在 add 运算符中不兼容。
      • 是的...如果您删除“类型”,然后将整个结果转换为 xml,那将有所帮助。像这样:`SELECT cast(' xml...>' + (select 'Dimension' as [@type]....for xml path('DimensionImport')) as xml)
      • Hmmm ... 如果我删除 xml 声明中的字符编码,它 运行,但如果我有它,则不会。使用声明中的字符编码,我收到此错误“XML 解析:第 1 行,字符 39,无法切换编码”。当我删除它运行的字符编码时,但我仍然没有将xml声明附加到xml。它只显示原始 xml。啊!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2010-11-04
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      相关资源
      最近更新 更多