1

私は 55MB の XML を持っており、OPENXML を使用してそれを細断しようとしています。これは、通常の XML 細断よりも高速であるように思われるからです。XML の構造は次のようになります。

<DATA_EXPORT>
<HEADER>
    <RECDATE>
        <START>2011-03-16</START>
        <END>2012-02-10</END>
    </RECDATE>
    <SOME_COUNT>10288</SOME_COUNT>
    <QUESTION_MAP>
        <QUESTION>
            <SERVICE>OU</SERVICE>
            <VARNAME>UNIT</VARNAME>
            <QUESTION_TEXT></QUESTION_TEXT>
        </QUESTION>
                250 more nodes like <QUESTION> 
    </QUESTION_MAP>
</HEADER>
<SOMENODES>
    <SURVEY_ID>448817197</SURVEY_ID>
    <CLIENT_ID>58</CLIENT_ID>
    <SERVICE>OU</SERVICE>
    <RECDATE>2011-03-29</RECDATE>
    <DISDATE>2010-03-29</DISDATE>
</SOMENODES>
    :
    :
   1000s of nodes like <SOMENODES>
</DATA_EXPORT>

そして、ノードからデータを取得するために次のクエリを使用しています

declare @xmlData varchar(max) = null
        ,@iDoc int  = null
        ,@xml xml = null

select @xmlData = cast(@xml as varchar(max))

    exec sp_xml_preparedocument @iDoc OUTPUT, @xmlData 

    select *
          ,getdate()
    from openxml(@iDoc, '//DATA_EXPORT/SOMEDATA', 2)
    with (
        surveyId        varchar(50)     'SURVEY_ID[1]',
        clientId        int         'CLIENT_ID[1]',
        [service]       varchar(50)     'SERVICE[1]',
        recieveDate     datetime        'RECDATE [1]',
        dischargeDate   datetime                'DISDATE [1]'
    )
    option (optimize for unknown)

これはストアド プロシージャであると書きましたが、次のエラーが発生しています。

The XML parse error 0xc00ce562 occurred on line number 1, near the XML text "<".
Msg 6602, Level 16, State 2, Procedure sp_xml_preparedocument, Line 1
The error description is 'A declaration was not closed.'.
Msg 8179, Level 16, State 5, Procedure q_ImportSurveyMasterDetails, Line 81
Could not find prepared statement with handle 0.
The statement has been terminated.

エラーで示されている行番号のエラーは何ですか?? また、55MB の XML ファイルを細断処理す​​るためのより適切で高速な方法はありますか??

前もって感謝します。

4

1 に答える 1

1

問題#1 The XML parse error 0xc00ce562 occurred on line number 1, near the XML text "<":。@xmlData を @xml に変更することで修正しました。つまり、varchar(max) に変換せず、xml として渡すだけです。お世話になった @dan radu に感謝します。

問題#2:マージステートメント内のオプションキーワード。マージステートメント自体が単一のSQLステートメントであるため、マージ内では使用できないようです。これは、merge ステートメントの最後で使用する必要があります。

merge dbo.table1 as target 
using (
        select 
            n.value('(SURVEY_ID)[1]', 'bigint') as surveyId
            ,n.value('(CLIENT_ID)[1]', 'int') as clientId
            ,n.value('(SERVICE)[1]', 'varchar(50)') as [service]
            ,n.value('(RECDATE)[1]', 'datetime') as recieveDate
            ,n.value('(DISDATE)[1]', 'datetime') as dischargeDate
        from @xml.nodes('//DATA_EXPORT/SOMENODES') x(n)

        ) as source 
 on target.surveyId = source.surveyId
    and target.[service] = source.[service]
 when matched then 
 update set 
        target.clientId = source.clientId,
        target.[service] = source.[service],
        target.surveyRecieveDate = source.recieveDate,
        target.dischargeDate = source.dischargeDate
when not matched then
insert (surveyId, clientId, [service], surveyRecieveDate, dischargeDate)
values (surveyId, clientId, [service], recieveDate, dischargeDate)
option (optimize for unknown);
于 2012-07-12T17:47:38.730 に答える