0
votes

XML sans élément d'enregistrement doit être converti en tableau à l'aide de TSQL / SQL Server.

XML sans élément d'enregistrement doit convertir en une table à l'aide de T-SQL dans SQL Server.

ID    Appcode
---------------
1     Code 1
2     Code 2
3     Code 3
4     Code 4
5     Code 5


3 commentaires

Quelle est ta question? Vous nous avez donné vos données d'échantillonnage et attendez-vous des résultats, mais je n'ai rien posé rien. Avez-vous essayé quelque chose jusqu'à présent pour obtenir votre XML à vos résultats? Veuillez nous montrer vos tentatives.


Votre xPath dans le .nodes () appel a un / entrée dans elle - mais le XML ne montre aucune Donc, cette xpath ne choisira rien ....


Désolé, laissez-moi mettre à jour.


3 Réponses :


0
votes

En supposant que ce format est le format que vous êtes après: xxx pré>

Voici comment je le ferais: P>

DECLARE @X XML = '
<ROOT>
    <RECORD>
        <ID>1</ID>
        <AppCode>Code 1</AppCode>
        <ID>2</ID>
        <AppCode>Code 2</AppCode>
    </RECORD>
</ROOT>';


SELECT V.ID,AppCode
FROM @X.nodes('/ROOT/RECORD') AS X(R)
     CROSS APPLY (VALUES(X.R.value('(./ID/text())[1]','int'),X.R.value('(./AppCode/text())[1]','varchar(10)')),
                        (X.R.value('(./ID/text())[2]','int'),X.R.value('(./AppCode/text())[2]','varchar(10)'))) V(ID,AppCode)


5 commentaires

Nice, mais j'ai cinq colonnes. Peut-il travailler avec ça? Laisse-moi essayer.


J'ai 5 champs et 20 enregistrements en résultat


Avec le nouvel échantillon, vous devriez facilement pouvoir développer ce @isb. Si vous ne comprenez pas ce qui précède, demandez-vous, c'est vous qui a besoin de le soutenir. Comment faire chaque ligne devrait cependant être assez apparente.


Ci-dessous donne un résultat comme une table séparée. Pouvez-vous aider à savoir comment je combine ces dans une table unique Sélectionnez TCValue ('(.)', 'NvarchaRar (max)') comme ID de @ X.Nodes ('/ racine / enregistrement / ID') T (c) Sélectionnez TC valeur ('(.)', 'nvarchar (max)') comme ID de @ x.nodes ('/ racine / enregistrement / app code') t (c)


Cela ne ressemble à rien comme le SQL que j'ai écrit @isb. Regardez à nouveau sur la mienne, spécialement la clause . Notez que chaque ligne a une valeur incrémentée pour le singleton?



0
votes

Si vous pouvez modifier votre format XML et utiliser la requête comme suit pour obtenir le résultat

ID  AppCode
1   Code 1
2   Code 2
3   Code 3
4   Code 4
5   Code 5


5 commentaires

C'est savoir. Le problème est XML que nous recevons d'un autre système. Difficile de mettre à jour / changer XML


Je pense que Modifier XML sera beaucoup plus facile que T-SQL pour des lignes inconnues. Si nécessaire, je peux vous aider à écrire du code T-SQL pour mettre à jour XML


Ci-dessous donne un résultat comme une table séparée. Pouvez-vous aider à savoir comment je combine ces dans une table unique Sélectionnez TCValue ('(.)', 'NvarchaRar (max)') comme ID de @ X.Nodes ('/ racine / enregistrement / ID') T (c) Sélectionnez TC valeur ('(.)', 'nvarchar (max)') comme ID de @ x.nodes ('/ racine / enregistrement / app code') t (c)


Mon t-sql est sorti dans une table


; Avec CTE1 comme (sélectionnez TCValue ('(.)', 'Nvarchar (max)') comme ID, Row_Number () sur (Commande par (Sélectionnez NULL)) RR à partir de @ x.nodes ('/ racine / record / ID ') T (c)), CTE2 AS (Sélectionnez TCValue (' (.) ',' NvarchaRar (max) ') comme AppCode, Row_Number () sur (Commande par (Sélectionnez NULL)) RR de @ x.nodes ('/ Root / enregistrement / appcepte') T (c)) Sélectionnez Cte1.Id, CTE2.AppCode de CTE1 JOIS CTE2 sur CTE1.RR = CTE2.RR



0
votes

Mise à jour 2: Ce sera la meilleure approche

Essayez-la P>

WITH AllNodes AS
(
    SELECT (ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1) / 3 AS RowGroup
          ,nd.value('local-name(.)','nvarchar(max)') AS NodeName
          ,nd.value('text()[1]','nvarchar(max)') AS NodeValue
    FROM @X.nodes('/ROOT/RECORD/*') A(nd)
)
SELECT RowGroup
      ,MAX(CASE WHEN NodeName='ID' THEN NodeValue END) AS ID
      ,MAX(CASE WHEN NodeName='AppCode' THEN NodeValue END) AS AppCode
      ,MAX(CASE WHEN NodeName='SomeMore' THEN NodeValue END) AS SomeMore
FROm AllNodes
GROUP BY RowGroup
  • Comptez les identifiants et renvoyez une table dérivée em> avec un numéro d'exécution (dans ce cas 1,2,3,4,5). Utilisez ensuite ce numéro pour résoudre les éléments par leur position. Li> ul>

    Deux autres approches, juste pour le plaisir: -) h2>

    Cela devrait fonctionner avec de nombreuses colonnes assez rapides: p> xxx pré>

    l'idée : p>

    • Lisez les identifiants et trouvez leur position li>
    • Lisez les éléments correspondants à l'aide de la position de l'ID via SQL: colonne () code> li> ul>

      mise à jour: une approche supplémentaire en utilisant Agrégation conditionnelle em> h2>

      Ceci devrait être plus rapide: p>

      DECLARE @X XML = '<ROOT>
                            <RECORD>
                                <ID>1</ID>
                                <AppCode>Code 1</AppCode>
                                <ID>2</ID>
                                <AppCode>Code 2</AppCode>
                                <ID>3</ID>
                                <AppCode>Code 3</AppCode>
                                <ID>4</ID>
                                <AppCode>Code 4</AppCode>
                                <ID>5</ID>
                                <AppCode>Code 5</AppCode>
                            </RECORD>
                        </ROOT>';
      WITH allIDs AS
      (
          SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Pos
                ,id.value('text()[1]','int') AS ID
          FROM @X.nodes('/ROOT/RECORD/ID') A(id)
      )
      SELECT ai.Pos
            ,ai.ID
            ,@X.value('/ROOT[1]/RECORD[1]/AppCode[sql:column("ai.Pos")][1]','nvarchar(max)') AS AppCode
            ,@X.value('/ROOT[1]/RECORD[1]/SomeMore[sql:column("ai.Pos")][1]','nvarchar(max)') AS SomeMore
      FROM allIDs ai
      ORDER BY ai.Pos;
      
      • Nous lisons tous les nœuds en tant que structure EAV. Le (Row_Number-1) / 3 code> (Division Entier!) Retournera un index de groupe que nous pouvons utiliser dans groupe par code>. Le reste est pivot à l'ancienne em>. Li> ul>

        avertissements pour les deux approches forte>: p>

        • Ceci nécessite une structure sans éléments manquants. Si XML pourrait inclure des sections, où l'un des noeuds suiveurs est manquant, cela ne fonctionnera pas. LI>
        • La solution avec Row_Number () sur (commande par (sélectionneur null)) code> a travaillé pour moi dans tous les cas que je l'ai utilisé. Mais il vaut la peine de mentionner que ce n'est pas garanti em> de retourner la position correcte. LI> ul> h2>


0 commentaires