2

Je ne parviens pas à écrire une procédure stockée pour l'insertion en bloc dans ma table.BULK INSERT utilisant XML

Je veux insérer la liste de <ObjectID> dans [tbl_ReleaseHistory] en gardant <FeatureID> null.

De même, lors de l'insertion de <FeatureID> dans la même table <ObjectID> doit rester null.

Je ne peux accomplir que l'insertion du premier <ObjectID> et <FeatureID>, c'est-à-dire 2218 et 67 du xml passé pour l'exécution factice.

Maintenant, comment itérer liste de <objectID> pour l'insertion?

Alors Y a-t-il une autre méthode?

Comment effectuer une insertion en masse à l'aide de XML?

CREATE PROCEDURE [dbo].[spVersionAddReleaseHistory] @ApplicationMaster NTEXT 
AS 
/****************************************************************************   
    DESCRIPTION:   
    ------------   
    This script is used to insert new record to the table tbl_VersionMaster. 
    MAINTENANCE LOG:   
    DATE   AUTHOR    DESCRIPTION   
    ----   ------    -----------   
    01/07/2011 Isha     Initial Creation 

     /*DUMMY EXECUTION : */ 
     DECLARE   @return_value int 
     EXEC   @return_value = [dbo].[spVersionAddReleaseHistory] 
           @ApplicationMaster = N'<Root><ApplicationEntity> 
              <Id>0</Id> 
              <versionId>0</versionId> 
              <Versions> 
               <Version> 
                <Application>1111</Application> 
                <Version>11.11.123.123</Version> 
                <VersionMajor>11</VersionMajor> 
                <VersionMinor>11</VersionMinor> 
                <VersionBuild>123</VersionBuild> 
                <VersionRevision>123</VersionRevision> 
                <VersionFeatureIdList> 
                 <FeatureID>67</FeatureID> 
                 <FeatureID>68</FeatureID> 
                 <FeatureID>69</FeatureID> 
                </VersionFeatureIdList> 
                <VersionObjectIdList> 
                 <ObjectID>2218</ObjectID> 
                 <ObjectID>2219</ObjectID> 
                 <ObjectID>2220</ObjectID> 
                 <ObjectID>2221</ObjectID> 
                 <ObjectID>2222</ObjectID> 
                 <ObjectID>2223</ObjectID> 
                 <ObjectID>2224</ObjectID> 
                 <ObjectID>2225</ObjectID> 
                 <ObjectID>2226</ObjectID> 
                 <ObjectID>2227</ObjectID> 
                 <ObjectID>2228</ObjectID> 
                 <ObjectID>2229</ObjectID> 
                </VersionObjectIdList> 
                <Components> 
                 <Component>2218-Cmpjhhghghjghjg</Component> 
                 <Component>2219-NEW </Component> 
                 <Component>2220-OLD</Component> 
                </Components> 
                <Tables> 
                 <Table>2221-t</Table> 
                 <Table>2223-ty</Table> 
                </Tables> 
                <StoredProcedures> 
                 <StoredProcedure>2226-tr</StoredProcedure> 
                 <StoredProcedure>2227-trigr</StoredProcedure> 
                </StoredProcedures> 
                <Triggers> 
                 <Trigger>2226-tr</Trigger> 
                 <Trigger>2227-trigr</Trigger> 
                </Triggers> 
                <Features> 
                 <Feature>2224-ffu</Feature> 
                 <Feature>2225-ffffu</Feature> 
                </Features> 
               </Version> 
              </Versions> 
              </ApplicationEntity></Root>' 
    SELECT  'Return Value' = @return_value 

    ****************************************************************************/ 
     DECLARE  @hDoc INT 
     EXEC  Sp_xml_preparedocument 
        @hDoc       OUTPUT, 
        @ApplicationMaster 

     -- SET identity_insert tbl_versionmaster ON 
     DECLARE @mylastident AS int 

    SET @mylastident = (SELECT max(VM_VersionId) from [tbl_VersionMaster]) 
     BEGIN 
        INSERT INTO [tbl_ReleaseHistory] 
         ( [RL_VersionId]   , 
           [RL_ObjectId]   , 
           [RL_FeatureId] 
         ) 
        SELECT  
           @mylastident   , 
           ObjectID    , 
           NULL 
        FROM OPENXML(@hDoc,'Root/ApplicationEntity/Versions/Version/VersionObjectIdList',2) 
        WITH(
           ObjectID   INT , 
           FeatureID   INT 
         ) xmlitems 
     END 

     BEGIN 
        INSERT INTO [tbl_ReleaseHistory] 
              ( [RL_VersionId]   , 
               [RL_ObjectId]   , 
               [RL_FeatureId] 
             ) 
        SELECT  
               @mylastident   , 
               NULL     , 
               FeatureID 
        FROM OPENXML (@hDoc,'Root/ApplicationEntity/Versions/Version/VersionFeatureIdList',2) 
        WITH     (
               ObjectID   INT , 
               FeatureID   INT 
             ) xmlitems 
     END 
     SET NOCOUNT OFF; 
     EXEC Sp_xml_removedocument @hDoc 

Merci

+0

Pourquoi l'étiquette C#? – jv42

Répondre

3

pas à 100% sûr que je comprends ce que vous essayez de faire .... mais en supposant que ceci est votre fichier XML:

DECLARE @Input XML 
SET @Input = '<Root> 
       <ApplicationEntity> 
        <Id>0</Id> 
        <versionId>0</versionId> 
        <Versions> 
         <Version> 
          <Application>1111</Application> 
          <Version>11.11.123.123</Version> 
          <VersionMajor>11</VersionMajor> 
          <VersionMinor>11</VersionMinor> 
          <VersionBuild>123</VersionBuild> 
          <VersionRevision>123</VersionRevision> 
          <VersionFeatureIdList> 
          <FeatureID>67</FeatureID> 
          <FeatureID>68</FeatureID> 
          <FeatureID>69</FeatureID> 
          </VersionFeatureIdList> 
          <VersionObjectIdList> 
          <ObjectID>2218</ObjectID> 
          <ObjectID>2219</ObjectID> 
          <ObjectID>2220</ObjectID> 
          <ObjectID>2221</ObjectID> 
          <ObjectID>2222</ObjectID> 
          <ObjectID>2223</ObjectID> 
          <ObjectID>2224</ObjectID> 
          <ObjectID>2225</ObjectID> 
          <ObjectID>2226</ObjectID> 
          <ObjectID>2227</ObjectID> 
          <ObjectID>2228</ObjectID> 
          <ObjectID>2229</ObjectID> 
          </VersionObjectIdList> 
          .... (more stuff - not relevant here) .... 
         </Version> 
        </Versions> 
       </ApplicationEntity> 
       </Root>' 

vous pouvez facilement sélectionner tous ObjectID valeurs à l'aide des fonctionnalités SQL Server 2005 XQuery (beaucoup plus facile à utiliser que l'ancienne substance openxml):

SELECT 
    V.VOI.value('(.)[1]', 'int') 
FROM 
    @Input.nodes('/Root/ApplicationEntity/Versions/Version/VersionObjectIdList/ObjectID') V(VOI) 

ou la liste des numéros de fonctionnalités:

SELECT 
    F.FID.value('(.)[1]', 'int') 
FROM 
    @Input.nodes('/Root/ApplicationEntity/Versions/Version/VersionFeatureIdList/FeatureID') F(FID) 

Maintenant, que voulez-vous faire avec ces valeurs ??

Mise à jour: OK, donc d'insérer les valeurs, utilisez cette déclaration:

INSERT INTO dbo.tbl_ReleaseHistory(RL_VersionId, RL_ObjectId, RL_FeatureId) 
    SELECT 
     V.VOI.value('(.)[1]', 'int'), 
     (some value for RL_ObjectId), 
     (some value for RL_FeatureId) 
    FROM 
     @Input.nodes('/Root/ApplicationEntity/Versions/Version/VersionObjectIdList/ObjectID') V(VOI) 

et de même pour les caractéristiques, aussi.

+0

Je veux insérer ces valeurs ... mais donne une erreur à l'exécution que la sous-requête a renvoyé plus de 1 valeur. Ceci n'est pas autorisé lorsque la sous-requête suit =,! =, <, <= , >,> = ou lorsque la sous-requête est utilisée comme une expression. INSERT INTO [tbl_ReleaseHistory] ([RL_VersionId] \t, [RL_ObjectId], [RL_FeatureId]) \t SELECT \t \t @mylastident, (SELECT V.VOI.value ('(.) [1]', 'int') à partir de \t \t @ xml.nodes ('/ Root/ApplicationEntity/Versions/Version/VersionObjectIdList/ObjectID'), NULL FROM OPENXML (@ hDoc, 'Racine/ApplicationEntity/Versions/Version/VersionObjectIdList', 2) WITH (ObjectID \t \t INT \t, FeatureID INT ) xmlitems – Rachel

+0

@Rachel: mise à jour de ma réponse –