将属性添加到根节点

时间:2016-07-11 14:46:19

标签: sql sql-server xml

请参阅下面的DDL:

create table #Dataset1 (id int not null identity,firstname varchar(30),surname varchar(30), primary key (id))
insert into #Dataset1 (firstname,surname) values ('Mark','Williams')

以下的SQL:

select firstname,surname 
from #Dataset1 
FOR XML PATH('Dataset1')

返回:

<Dataset1>
  <firstname>Mark</firstname>
  <surname>Williams</surname>
</Dataset1>

如何让SQL返回:

<Dataset1 URN='1'>
  <firstname>Mark</firstname>
  <surname>Williams</surname>
</Dataset1>

URN = 1将被编码到XML中,即不是从数据库中生成的。

2 个答案:

答案 0 :(得分:0)

试试这个

SELECT
    id AS [@URN]
    ,firstname
    ,surname
FROM #Dataset1
FOR XML PATH ('Dataset1')

<强>结果

<Dataset1 URN="1">
  <firstname>Mark</firstname>
  <surname>Williams</surname>
</Dataset1>

答案 1 :(得分:0)

我的问题并不是很清楚(特别是关于硬编码的最后一句话)......

以下是四种不同的方法:

如果将被硬编码,即不是从数据库生成意味着修复值应该是这个

SELECT 1 AS [@URN]
      ,firstname
      ,surname 
FROM #Dataset1 FOR XML PATH('Dataset1');

如果要将此属性添加到现有XML,则可以执行此操作

DECLARE @xml XML=
(
    SELECT firstname
          ,surname 
    FROM #Dataset1 FOR XML PATH('Dataset1'),TYPE
);
SET @xml.modify('insert attribute URN {"1"} into (/Dataset1)[1]');
SELECT @xml;

如果以后再添加,你可以在字符串级别上执行此操作(但我不建议这样做)

DECLARE @xml XML=
(
    SELECT firstname
          ,surname 
    FROM #Dataset1 FOR XML PATH('Dataset1'),TYPE
);
SET @xml=
CAST
( 
    REPLACE
    (
     CAST(@xml AS NVARCHAR(MAX))                
    ,N'<Dataset1>',N'<Dataset1 URN="1">')
AS XML);
SELECT @xml;

所有三个都将返回

<Dataset1 URN="1">
  <firstname>Mark</firstname>
  <surname>Williams</surname>
</Dataset1>

如果您的“URN”实际上是名称空间

WITH XMLNAMESPACES(DEFAULT 'SomeDefault'
                  ,'SomeOther' AS URN)
SELECT firstname
      ,surname 
FROM #Dataset1 FOR XML PATH('Dataset1')

结果就是这个

<Dataset1 xmlns:URN="SomeOther" xmlns="SomeDefault">
  <firstname>Mark</firstname>
  <surname>Williams</surname>
</Dataset1>