当前位置: 首页 > 面试题库 >

如何在SQL Server 2014中的XML的根目录中添加xmlns

舒博雅
2023-03-14
问题内容

我正在尝试在SQL Server 2014中XML的根元素中添加xmlns MsgDtTmMessageId属性。我正在尝试以下操作:

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>

xmlnsDefault元素中获得了空白属性。我想xmlnsPerson元素不是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;

重要的

请点击此链接,登录并投票。

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



 类似资料:
  • 使用IntelliJ 14和Gradle 2.2中的“idea”插件生成IntelliJ项目。我可以通过以下方式为集成测试添加新的测试源根目录: 但是,我还没有找到一种方法来添加位于“src/集成测试/资源”的相应测试资源根。对此有什么想法吗?非常感谢。 -丹尼尔

  • 问题内容: 我想编写一个可以运行测试的Makefile。测试位于目录“ ./tests”中,而要测试的可执行文件位于目录“ ./bin”中。 当我运行测试时,他们看不到exec文件,因为目录./bin不在$ PATH中。 当我做这样的事情: 一切正常。但是我需要在Makefile中更改$ PATH。 简单的Makefile内容: 它可以正确打印路径,但是找不到文件x。 当我手动执行此操作时: 一切

  • 我试图用xml2js构建一个XML节点。当我添加包装在cdata中的html标签时,它会创建一个单独的节点,如下所示。如果我把CDATA包在里面"

  • 我想使用静态目录中的资源,这个目录可能有另一个子目录。 在spring boot应用程序中。属性文件,我使用下面的键引用外部目录:C:/custsources/。我可以引用此目录中的资源,但不能引用子目录中的资源,例如C:/custsources/1、C:/custsources/2等。 <代码>Spring。资源。静态位置=类路径:/META-INF/resources/,类路径:/resour

  • 根据这个QA,我们可以使用参数,用于添加要标记为白名单的目录,因为在git上找到了最新的CVE。但似乎没有办法递归地添加某些dir。 我有太多的存储库要添加,所以如果该功能存在,我想改用递归添加。存储库主要放在我在ubuntu上安装的NTFS磁盘上,所以里面的文件的所有者总是root用户。如果登录的用户与git目录的所有者不匹配,则最新更新会显示错误,例如

  • 问题内容: 我使用 Apache Mina Sshd API 在 Java 中启动本地SFTP服务器。在SFTP客户端中,我使用 Jcraft jsch API 创建我的SFTP 客户端。我成功启动了服务器。问题是我想编写一些单元测试用例检查客户端是否可以将一些文件放入服务器的根目录。目前我的SFTP服务器没有任何根目录,所以我想知道有什么方法可以设置服务器的根目录。 例如: C:\ sftp 我