我正在尝试在SQL Server 2014中XML的根元素中添加xmlns MsgDtTm&MessageId属性。我正在尝试以下操作:
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>
我xmlns在Default元素中获得了空白属性。我想xmlns在Person元素不是Default元素。我的预期结果如下:
xmlns
Default
Person
<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。
;WITH XMLNAMESPACES ('http://abc.go.com' as f)
xmlns:f="..."
:objectOfXMLNAMESPACES
SQL Server一遍又一遍地向每个子选择添加名称空间,这是一个非常令人讨厌的行为。
您将在SO上找到很多变通方法,其中一些使用丑陋的强制转换NVARCHAR(MAX)在字符串基础上插入名称空间,而另一些则使用或多或少复杂的方法。
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;
请点击此链接,登录并投票。
这是一个持续 多年的 众所周知的问题 !!..