2008-12-04 7 views
2

J'ai une table dans une base de données SQL 2005 qui contient une colonne définie en tant que type de données xml. J'essaye d'écrire le proc stocké qui interroge le xml et renvoie un resultset d'une instruction select. J'ai vu des exemples de valeurs scalaires retournées ou xml mais pas comment retourner un resultset. Est-ce que je vais devoir utiliser openxml ou existe-t-il une autre solution?Convertir un type de données XML dans SQL 2005 en un jeu de résultats relationnel

Répondre

2

Le type de données xml possède son propre ensemble de méthodes que vous pouvez utiliser pour gérer les données de la colonne. Dans ce cas, vous auriez probablement utiliser quelque chose comme ceci:

select xmlColumnName.value('XpathExpression', 'outputSqlType') from dataTable 

Par exemple,

select xmlColumnName.value('/root/node[@name="myname"]', 'varchar(60)') 

Les méthodes query(), la valeur(), existent(), modifier() et noeuds (), et vous pouvez en lire plus à leur sujet dans la documentation en ligne.

1

Vous pouvez utiliser le type de données xml ou OPENXML. Une autre affiche donnait un exemple de type de données XML, donc voici un exemple OPENXML.

Cela dépend vraiment du schéma XML. SQL Server peut ne pas très bien aimer votre schéma. Si vous avez un contrôle sur le schéma, cela aide. Vous devrez peut-être utiliser une variable de table et générer les données avec plusieurs appels à OPENXML pour tout interroger.

Par exemple, l'entrée XML peut être traité comme suit:

DECLARE @idoc int 
DECLARE @doc nvarchar(max) 

SET @doc = ' 
<xml> 
    <Entry Type="Error" Start="2008-11-19 02:16:00" End="2008-11-20 04:55:00" /> 
    <Entry Type="Success" Start="2008-11-25 12:45:00" End="2008-11-25 13:01:00" /> 
</xml>' 


EXEC sp_xml_preparedocument @idoc OUTPUT, @xml 

SELECT [EventType] 
     ,[EventStart] 
     ,[EventEnd] 
FROM OPENXML (@idoc, '//Event',1) 
     WITH ([Type]   varchar(30) 
       ,[Start]  varchar(30) 
       ,[End]   varchar(30) 
) 

L'un des défis que j'ai rencontrés était l'analyse syntaxique date XML (ISO8601 avec le « T » et le fuseau horaire possible). J'ai fini par créer un assemblage .NET avec une seule ligne de code pour le convertir en un datetime que SQL a aimé.

Questions connexes