it-swarm-fr.com

Proc stocké pour gérer XML comme entrée Param pour plusieurs inserts d'enregistrement

j'ai mis à jour ma procréation de la prise de types de données typiques pour prendre un seul paramètre XML afin que je puisse l'appeler une fois au lieu de plusieurs fois pour insérer plusieurs enregistrements.

voici un échantillon de mon procédé qui fonctionne bien ...

ALTER PROCEDURE [dbo].[ins_Attachment_xml] 
    @XML XML
AS
BEGIN

        DECLARE @messageId INT
        SET @messageId = (SELECT n.c.value('@MessageId','int') FROM @XML.nodes('/Attachment') n(c))    

        SELECT  
            rr.item.value('@FileboxId','varchar(MAX)') AS FileboxId,  
            rr.item.value('@FileName','varchar(MAX)') AS FileName
        INTO #tmp  
        FROM @XML.nodes('/Attachment/item') AS rr(item)   

        INSERT INTO Attachment (MessageId,FileboxId,FileName)
        SELECT @messageId, T.FileboxId, T.FileName
        FROM #tmp T 
END


exec ins_Attachment_xml
@XML =
'<Attachment MessageId="2">
  <item FileboxId="FB1"  FileName="notes.doc" />
  <item FileboxId="FB2"  FileName="W2.jpeg" />
  <item FileboxId="FB3"  FileName="2011 Taxes.pdf" />
</Attachment>'

maintenant, je dois modifier le paramètre XML qui est transmis à cela, mais je ne sais pas comment mettre à jour le PROC pour le faire fonctionner avec la nouvelle structure XML. C'est le nouveau XML:

<MessageRecipient> 
<MessageId>52</MessageId> 

<Recipient>
        <RecipientTypeId>2</RecipientTypeId>
        <EmailAddress>[email protected]</EmailAddress>
        <FriendlyName>Dig s</FriendlyName>
        <UFID>Dig123</UFID>
</Recipient> 

<Recipient>
    <RecipientTypeId>3</RecipientTypeId>
    <EmailAddress>[email protected]</EmailAddress>
    <FriendlyName>ash k</FriendlyName><UFID>ashish</UFID>
</Recipient> 

<Recipient>
    <RecipientTypeId>4</RecipientTypeId>
    <EmailAddress>[email protected]</EmailAddress>
    <FriendlyName>dee v</FriendlyName>
    <UFID>dee123</UFID>
</Recipient> 
</MessageRecipient>
4
kacalapy

La solution de @sankar Reddy devrait fonctionner pour analyser le XML mais pour la performance, j'étais analysé le XML en dehors de la base de données. J'ai vu des problèmes auparavant avec un complexe XML complexe à grande charge dans les bases de données, bien que j'utilise XML analysant, mais pas pour des charges élevées.

Je passerais les données déchiquetées en tant que table, à l'aide d'un tableau de paramètres valorisés pour SQL Server 2008+ ou une table Temp.

Au moins, séparez l'analyse XML dans un processus stocké qui appelle une autre qui stocke dans la base de données. De cette façon, vous pouvez voir des inserts avec l'insert final qui serait masqué par l'analyse XML qui tend à prendre 98% d'une requête dans les plans d'exécution graphiques

2
gbn