【问题标题】:How to add xmlns in the root in XML in SQL Server 2014如何在 SQL Server 2014 的 XML 根目录中添加 xmlns
【发布时间】:2017-04-04 16:22:54
【问题描述】:

我正在尝试在 SQL Server 2014 的 XML 根元素中添加 xmlns MsgDtTmMessageIdattributes。我正在尝试这个:

declare @TEMP table (ID nvarchar(max), Name nvarchar(max))
declare @count int =0
WHILE @count < 4 
BEGIN  
   declare @name nvarchar(20),@id nvarchar(max)
   select @name= SUBSTRING(CONVERT(varchar(255), NEWID()), 0, 7)
         ,@id= CHAR(ROUND(RAND() * 93 + 33, 0))
   insert into @TEMP values(@id,@name)
   set @count= @count +1
END  

declare @msgId nvarchaR(24)
SET @msgId='11EXP'+REPLACE(convert(varchar(10),getdate(),103),'/','')+'1'
DECLARE @Xml xml
SET @Xml = (select * from @TEMP for xml path('DefaultName'), type)
;WITH XMLNAMESPACES (DEFAULT 'http://abc.go.com')
select GETDATE() as "@MsgDtTm"
  ,@msgId as "@MessageId"
  ,--'http://abc.go.com' as "@xmlns",
@Xml for xml path('Person')

得到这个结果

<Person xmlns="http://abc.go.com" MsgDtTm="2016-11-21T15:13:10.440" MessageId="11EXP211120161">
  <DefaultName xmlns="">
    <ID>y</ID>
    <Name>7BDCB6</Name>
  </DefaultName>
  <DefaultName xmlns="">
    <ID>2</ID>
    <Name>F8E997</Name>
  </DefaultName>
  <DefaultName xmlns="">
    <ID>"</ID>
    <Name>01E71C</Name>
  </DefaultName>
  <DefaultName xmlns="">
    <ID>k</ID>
    <Name>E4059A</Name>
  </DefaultName>
</Person>

我在Default 元素中得到了空白的xmlns 属性。我想要xmlns 中的Person 元素而不是Default 元素。我的预期结果如下:

<Person xmlns="http://abc.go.com" MsgDtTm="2016-11-21T15:13:10.440" MessageId="11EXP211120161">
  <DefaultName>
    <ID>y</ID>
    <Name>7BDCB6</Name>
  </DefaultName>
  <DefaultName>
    <ID>2</ID>
    <Name>F8E997</Name>
  </DefaultName>
  <DefaultName>
    <ID>"</ID>
    <Name>01E71C</Name>
  </DefaultName>
  <DefaultName>
    <ID>k</ID>
    <Name>E4059A</Name>
  </DefaultName>
</Person>

如果我使用;WITH XMLNAMESPACES ('http://abc.go.com' as f),那么它将在根目录下,但结果我会得到xmlns:f="..."。我不想追加:objectOfXMLNAMESPACES,我只想要xmlns。

【问题讨论】:

    标签: sql sql-server xml sql-server-2008-r2 sql-server-2014


    【解决方案1】:

    这是一个非常烦人的行为,SQL Server 一遍又一遍地为每个子选择添加命名空间。

    您会在 SO 上找到很多解决方法,有些使用丑陋的 NVARCHAR(MAX) 强制转换以在字符串基础上插入命名空间,其他使用或多或少复杂的方式。

    对你来说最简单的应该是这样的:

    DECLARE @xml XML;
    ;WITH XMLNAMESPACES (DEFAULT 'http://abc.go.com')
    SELECT @xml=
        (
            SELECT ID,Name
            FROM @TEMP
            FOR XML PATH('DefaultName'),ROOT('Person'),TYPE
        );
    DECLARE @d DATETIME=GETDATE();
    DECLARE @mid VARCHAR(100)='11EXP'+REPLACE(convert(varchar(10),getdate(),103),'/','')+'1';
    
    SET @xml.modify('insert (attribute MsgDtTm {sql:variable("@d")}
                            ,attribute MessageId {sql:variable("@mid")}) into (/*:Person)[1]');
    
    SELECT @xml;
    

    重要

    follow this link,登录并投票。

    这是一个持续年的众所周知的问题!..

    【讨论】:

    • 不错的把戏。附带说明一下,您可以在单个语句中添加多个属性,从而减少开销:SET @xml.modify('insert (attribute MsgDtTm {sql:variable("@d")}, attribute MessageId {sql:variable("@mid")}) into (/*:Person)[1]');
    • @RogerWolf。谢谢,不知道。我实际上已经尝试过了,但没有使用包装括号...很高兴知道,快乐编码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2013-12-03
    • 2021-09-18
    相关资源
    最近更新 更多