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 Réponses :
En supposant que ce format est le format que vous êtes après: 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)
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 code> code>. Notez que chaque ligne a une valeur incrémentée pour le singleton?
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
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
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
Cela devrait fonctionner avec de nombreuses colonnes assez rapides: p> l'idée : p> Ceci devrait être plus rapide: p> avertissements pour les deux approches forte>: p>
SQL: colonne () code> li>
ul> mise à jour: une approche supplémentaire en utilisant Agrégation conditionnelle em> h2>
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;
(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>
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>
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 () code> appel a un/ entrée code> dans elle - mais le XML ne montre aucune code> Donc, cette xpath ne choisira rien .... Désolé, laissez-moi mettre à jour.