2010-11-17 7 views
2

j'ai une procédure stockée qui prend une entrée de la valeur xml comme ceci:SQL Server 2005 requête XML procédure stockée

<?xml version="1.0" encoding="utf-16"?> 
<RWFCriteria xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" reportType="Executive"> 
    <item id="44" name="" value="" type="Project" /> 
    <item id="45" name="" value="" type="Project" /> 
    <item id="46" name="" value="" type="Project" /> 
    <item id="110" name="" value="" type="Milestone" /> 
    <item id="111" name="" value="" type="Milestone" /> 
</RWFCriteria> 

je dois joindre des tables à ces données et remplir les name="" attributs avec des données DB .

Comment est-ce que je fais cela dans SQL Server 2005?

Au pire, je pense que je peux analyser les données XML dans des tables temporaires pour chacun des deux types (projet & étape) et rejoindre à cette puis sélectionnez mes données avec un sql rusée utilisant FOR XML

Ou au moins Je pense que je devrais, ne l'ai pas encore fait fonctionner ...

Des indices?

Répondre

1

^Eh bien, en utilisant cette XQuery, vous pouvez « déchiqueter » votre XML dans un pseudo-tableau (une ligne pour chaque noeud <item> intérieur <RWFCriteria>) - que vous pouvez maintenant utiliser pour joindre contre d'autres tables, pas de problème:

SELECT 
    RWF.Item.value('(@id)[1]', 'int') AS 'ID', 
    RWF.Item.value('(@name)[1]', 'varchar(50)') AS 'Name', 
    RWF.Item.value('(@type)[1]', 'varchar(50)') AS 'Type' 
FROM 
    @XmlVariableOrColumn.nodes('/RWFCriteria/item') AS RWF(Item) 

me donne une sortie de:

ID Name Type 
44  Project 
45  Project 
46  Project 
110  Milestone 
111  Milestone 

Mise à jour: OK pour recréer votre XML, en fonction de votre table temporaire, vous avez besoin quelque chose comme ceci:

SELECT 
    id AS '@id', 
    projectname AS '@name', 
    VALUE AS '@value', 
    type AS '@type' 
FROM 
     #tmp t 
FOR XML PATH('item'), ROOT('RWFCriteria') 

Le PATH('item') définit l'élément pour chaque ligne de votre table, le ROOT('RWFCriteria') devrait être évident, et en spécifiant AS '@id' etc. sur vos colonnes étant sélectionné, vous définissez comment ceux-ci sont mis dans le <item> - en utilisant la @ les transforme en un attribut sur le nœud <item> (sans le @, ils seraient des éléments à l'intérieur du <item>).

-1

FOR XML est assez puissant.

En supposant quelque chose comme:

DECLARE @p_XmlData VARCHAR(MAX) 
SELECT @p_XmlData = '<RWFCriteria xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" reportType="Executive"> 
    <item id="44" name="" value="" type="Project" /> 
    <item id="45" name="" value="" type="Project" /> 
    <item id="46" name="" value="" type="Project" /> 
    <item id="110" name="" value="" type="Milestone" /> 
    <item id="111" name="" value="" type="Milestone" /> 
</RWFCriteria>' 

Voici un SELECT simple.

DECLARE @hDoc INT 
EXEC sp_xml_preparedocument @hDoc OUTPUT, @p_XmlData 

    SELECT 
     XMLData.id, 
     1 AS [Version], 
     XMLData.name, 
     XMLData.value, 
     XMLData.[type] 
    FROM OPENXML (@hdoc, 'RWFCriteria/item', 1) 
    WITH 
    (
     id int, 
     [name] varchar(256), 
     [value] varchar(256), 
     [type] varchar(256) 
    ) AS XMLData 

    EXEC sp_xml_removedocument @hDoc 

De là, le JOIN, etc. est simple.

Questions connexes