Veuillez consulter le DDL ci-dessous:

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')

Et le SQL ci-dessous :

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

Qui retourne:

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

Comment puis-je obtenir le retour du SQL :

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

URN=1 sera codé en code XML, c'est-à-dire non généré à partir de la base de données.

1
w0051977 11 juil. 2016 à 17:46

2 réponses

Meilleure réponse

Essaye ça

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

Résultat

<Dataset1 URN="1">
  <firstname>Mark</firstname>
  <surname>Williams</surname>
</Dataset1>
0
Krishnraj Rana 11 juil. 2016 à 17:51

Votre question n'est pas claire pour moi (surtout votre dernière phrase sur le codé en dur)...

Voici quatre approches différentes :

Si votre sera codé en dur, c'est-à-dire qu'il n'est pas généré à partir de la base de données signifie une valeur fixe, cela devrait être celui-ci

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

Si vous souhaitez ajouter ceci en tant qu'attribut à un XML existant, vous pouvez le faire

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;

Si cela devait être ajouté plus tard, vous pourriez le faire au niveau de la chaîne (mais je ne le conseillerais pas)

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;

Tous les trois reviendront comme

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

Si votre "URN" est un espace de noms en fait

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

Le résultat serait ceci

<Dataset1 xmlns:URN="SomeOther" xmlns="SomeDefault">
  <firstname>Mark</firstname>
  <surname>Williams</surname>
</Dataset1>
0
Shnugo 13 juil. 2016 à 08:25