2

我无法为批量插入到我的表中编写存储过程。使用XML的BULK INSERT

我想将<ObjectID>的列表插入[tbl_ReleaseHistory]保留<FeatureID>为空。

同时将<FeatureID>插入同一表<ObjectID>应保持为空。

我能够只完成插入第一个<ObjectID><FeatureID>即2218和67从虚拟执行传递的xml。

现在如何迭代<objectID>插入列表?

那么还有其他方法吗?

如何使用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 

感谢

+0

为什么选择C#标记? – jv42

回答

3

不是100%肯定,我明白你想要做什么....但假设这是你的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>' 

,你可以很容易地选择所有ObjectID使用SQL Server 2005 XQuery特性的值(比使用旧的openxml的东西容易得多):

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

或功能的ID名单:

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

现在你想与这些值做什么?

更新:行,所以插入值,使用此语句:

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) 

,同样的功能,太。

+0

我想插入这些值..但给执行错误,子查询返回多个值。当子查询遵循=,!=,<, <= , >,> =或当子查询用作表达式时,这是不允许的。 INSERT INTO [tbl_ReleaseHistory] ​​ ([RL_VersionId] \t,[RL_ObjectId],[RL_FeatureId])\t \t SELECT \t @mylastident,(SELECT V.VOI.value( '(。)[1]', 'INT')FROM (2)WITH WITH OPENXML(@ hDoc,'Root/ApplicationEntity/Versions/Version/VersionObjectIdList',2)WITH (ObjectID \t \t INT \t,FeatureID INT )xmlitems – Rachel

+0

@Rachel:更新了我的回复 –