2009-10-01 8 views
3

J'ai une table dans une base de données SQL Server 2005 qui enregistre les achats comme ceci:Comment interroger XML stocké sous forme de texte?

ID (PK, int, not null) 
Request (text, null) 
Response (text, null) 
MerchantId (varchar(14), null) 
Amount (money, null) 

Les champs de requête et de réponse sont le stockage vraiment XML. Je ne peux pas changer le type de données en XML. J'ai besoin de dessiner une requête qui va extraire des données des 2 champs text-as-XML en plus des données qui se trouvent dans la table elle-même.

Je ne sais pas par où commencer. La plupart de mes recherches reviennent avec des questions sur LINQ-to-SQL, et les résultats SQLXML que je reçois ne semblent pas capables de gérer des ensembles de données. Où devrais-je concentrer ma recherche?

+0

Essayez-vous de regrouper la requête LINQ to SQL et la requête LINQ to XML, ou pouvez-vous obtenir les résultats de la base de données, puis interroger le fichier XML séparément? –

+0

J'ai besoin d'un ensemble de résultats pour alimenter un rapport SSRS. Cela doit être fait exclusivement dans le langage SQL lui-même car je ne peux pas utiliser SQLCLR ou LINQ pour rendre cela plus facile. – JMP

+0

Ensuite, faites ce que Byron Whitlock a répondu, transtypé en XML dans une table dérivée, puis décompressez le XML en champs relationnels en utilisant xquery/xpath. –

Répondre

4

Utilisez CAST (texte en XML) pour obtenir une colonne XML typé qui peut être manipulé au niveau du serveur (la valeur d'usage, les noeuds et requête xml methods dessus).

SELECT ID, 
    CAST(Request AS XML) As RequestXml, 
    CAST(Request AS XML) As ResponsetXml, 
    MerchantId, 
    Amount 
FROM <table> 

Si vous avez seulement besoin du XML dans le client, alors vous pouvez simplement retourner le texte, puis utiliser tout ce qui est votre technologie XML côté client de choix (XmlDocument, XPathDocument, Linq 2 xml) ils tous permettent vous pour cosntruct un fragment d'une chaîne.

2

Vous pouvez jeter les données à la volée, par exemple .:

CAST(Request AS XML) 
0

Vous pouvez toujours CAST([Request] AS XML) et utiliser toutes les fonctions XML régulières pour extraire les données.

2
SELECT request.VALUE(/xpath/query) 
FROM 
(
    SELECT 
     CAST(Request as XML) request, 
     CAST(Response as XML) response 

    FROM purchaseTbl 
    WHERE ... 
) tbl 
WHERE ... 
0

Si vous utilisez SQL Server (2005 et après), une possibilité pourrait consister à écrire une fonction définie par l'utilisateur dans un langage .Net qui parse le XML à partir d'un champ et renvoie les données dans le cadre de Teh requête

Questions connexes