![](/img/trans.png)
[英]SQL Server - FOR XML PATH : how to add xmlns:xsd to the root element?
[英]How to add xmlns in the root in XML in SQL Server 2014
我试图在SQL Server 2014中的XML的根元素中添加xmlns MsgDtTm
和MessageId
属性。我正在尝试这样做:
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
属性。 我希望Person
元素中的xmlns
不在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)
然后它将在root中但在结果中我将获得xmlns:f="..."
。 我不想追加:objectOfXMLNAMESPACES
,我只想要xmlns。
这是一种非常烦人的行为,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;
请点击此链接 ,登录并投票。
这是一个持久多年的众所周知的问题! ..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.