2010-07-27 4 views
2

Utilisation de SQL Server 2008.Tableau Variable de sortie avec FOR XML AUTO

J'ai une variable de table avec une seule colonne et ligne unique.

Si je fais ceci:

Declare @testsToRun Table (testsId BigInt) 
Insert Into @testsToRun 
Select testsId From tests Where testsId = 10 

Select Top 1 * From @testsToRun 
For Xml Auto , Type , Root('testMessage') 

Je reçois XML qui ressemble à ceci:

<testMessage> 
    <_x0040_testsToRun testsId="10" /> 
</testMessage> 

Quand ce que je veux réellement est:

<testMessage> 
    <testsToRun testsId="10" /> 
</testMessage> 

Si la source de la ligne est une table qui semble bien fonctionner. Quand c'est une variable de table, je reçois une étiquette d'élément enfant que je ne veux pas, je veux testsToRun et non _x0040_testsToRun.

Comment puis-je retravailler mon instruction/clause FOR XML pour obtenir une sortie correcte?

Merci.

Répondre

3

Essayez plutôt - utiliser FOR XML PATH et de définir la structure de votre sortie avec l'alias de colonne (ses) que vous utilisez:

SELECT TOP 1 
    testsId AS '@testsId' 
FROM 
    @testsToRun 
FOR XML PATH('testsToRun'), ROOT('testMessage') 

Donne-moi:

<testMessage> 
    <testsToRun testsId="10" /> 
</testMessage> 
+0

Alors que cela change mes trucs de base attribut à l'élément basé (rendant le message entier plus grand), il était assez facile de changer mon code de lecteur de message. Cela fonctionne très bien. Merci! – Snowy

+0

@ScSub: comment cela change-t-il en éléments? Il vous donne 'testsId' comme attribut - comme vous l'avez spécifié dans votre message original .... –

1

Essayez d'utiliser un alias sur la table temporaire:

Declare @testsToRun Table (testsId BigInt) 
Insert Into @testsToRun 
Select testsId From tests Where testsId = 10 

Select Top 1 * From @testsToRun testsToRun 
For Xml Auto , Type , Root('testMessage') 
0

La valeur x0040 est le nom interne de la table temporaire. Vous obtiendrez une sortie normale lorsque vous sélectionnez à partir d'une table normale (donc .... l'option pourrait être de créer une table temporaire, sélectionnez ce que vous voulez et déposez-le de la base de données).