2017-02-22 9 views
2

私はこれでかなり新しいので、私に同行してください。私は一度に多くのXMLファイルをMicrosoft SQL Serverに転送しようとしています。残念ながら、私はスタイルオプション2で変換する必要があると言っているエラーが発生しています。私は非常に多くのファイルのためにこれを行う方法がわかりません。ここでMicrosoft SQL Serverで大量のXMLファイルを同時に変換するオプション2を使用する

は私のクエリです:

CREATE TABLE [dbo].[staagingTable] 
(
    [Counter] INT NOT NULL, 
    [majority] [nvarchar](max) NULL, 
    [congress] [int] NULL, 
    [session] [nvarchar](max) NULL, 
    [chamber] [nvarchar](max) NULL, 
    [rollcall-num] [int] NULL, 
    [legis-num] [nvarchar](max) NULL, 
    [vote-question] [nvarchar](max) NULL, 
    [vote-type] [nvarchar](max) NULL, 
    [vote-result] [nvarchar](max) NULL, 
    [action-date] [nvarchar](max) NULL, 
    [action-time] [nvarchar](max) NULL, 
    [vote-desc] [nvarchar](max) NULL, 
    [sourceXML] [XML] NULL 
); 
GO 

DECLARE @Counter INT=1; 
DECLARE @command VARCHAR(MAX); 

WHILE @Counter<800 
BEGIN 
    SET @command= 
    ' 
    DECLARE @xml XML= 
    (
    SELECT BulkColumn 
    FROM OPENROWSET (BULK ''C:\Users\Owner\Documents\congress\House votes\114 congress 2015\Passage\roll' + REPLACE(STR(@Counter,3),' ','0') + '.xml'', SINGLE_BLOB) AS c 
    ); 

    INSERT INTO dbo.staagingTable(Counter, majority, congress,[session], chamber, [rollcall-num], [legis-num], [vote-question], [vote-type], [vote-result], [action-date], [action-time], [vote-desc], [sourceXML]) 
     SELECT 
      ' + CAST(@Counter AS VARCHAR(10)) + ', 
      v.value(N''majority[1]'', N''nvarchar(max)''), 
      v.value(N''congress[1]'', N''int''), 
      v.value(N''session[1]'', N''nvarchar(max)''), 
      v.value(N''chamber[1]'', N''nvarchar(max)''), 
      v.value(N''rollcall-num[1]'', N''int''), 
      v.value(N''legis-num[1]'', N''nvarchar(max)''), 
      v.value(N''vote-question[1]'', N''nvarchar(max)''), 
      v.value(N''vote-type[1]'', N''nvarchar(max)''), 
      v.value(N''vote-result[1]'', N''nvarchar(max)''), 
      v.value(N''action-date[1]'', N''nvarchar(max)''), 
      v.value(N''action-time[1]'', N''nvarchar(max)''), 
      v.value(N''vote-desc[1]'', N''nvarchar(max)''), 
      @xml 
     FROM 
      @xml.nodes(N''/rollcall-vote/vote-metadata'') AS A(v); 
    '; 

    BEGIN TRY 
     EXEC(@command); 
    END TRY 
    BEGIN CATCH 
     PRINT ERROR_MESSAGE() 
    END CATCH; 

    SET @Counter = @Counter + 1; 
END 

SELECT * FROM dbo.staagingTable; 
GO 

DROP TABLE dbo.staagingTable; 

私は必要なもの一度、すべてのファイルを扱うということ、これを解決するためのいくつかの方法です。これらのファイルは実際には存在しないため、存在しないファイルのために一括読み込みできないというエラーは問題になりません。下の写真では、重要なエラーには、その隣に紫色の記号が描かれています。これらは唯一のものではありません。それらの何百もあります。これらは私がスクロールしたものの一部です。以下に示す2種類のエラーは、クエリの実行が発生した唯一のエラーです。

the screenshot of my errors

ファイルはすべて、同一の列、同じデータ型が、列のための様々な値が含まれています。以下はそのようなxmlドキュメントの1つの赤ん坊のバージョンです。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE rollcall-vote PUBLIC "-//US Congress//DTDs/vote v1.0 20031119 //EN" "http://clerk.house.gov/evs/vote.dtd"> 
<?xml-stylesheet type="text/xsl" href="http://clerk.house.gov/evs/vote.xsl"?> 
<rollcall-vote> 
    <vote-metadata> 
     <majority>R</majority> 
     <congress>114</congress> 
     <session>1st</session> 
     <chamber>U.S. House of Representatives</chamber> 
     <rollcall-num>6</rollcall-num> 
     <legis-num>H RES 5</legis-num> 
     <vote-question>On Agreeing to the Resolution</vote-question> 
     <vote-type>YEA-AND-NAY</vote-type> 
     <vote-result>Passed</vote-result> 
     <action-date>6-Jan-2015</action-date> 
     <action-time time-etz="17:30">5:30 PM</action-time> 
     <vote-desc>Adopting rules for the One Hundred Fourteenth Congress</vote-desc> 
     <vote-totals> 
      <totals-by-party-header> 
       <party-header>Party</party-header> 
       <yea-header>Yeas</yea-header> 
       <nay-header>Nays</nay-header> 
       <present-header>Answered “Presentâ€</present-header> 
       <not-voting-header>Not Voting</not-voting-header> 
      </totals-by-party-header> 
      <totals-by-party> 
       <party>Republican</party> 
       <yea-total>234</yea-total> 
       <nay-total>4</nay-total> 
       <present-total>1</present-total> 
       <not-voting-total>3</not-voting-total> 
      </totals-by-party> 
      <totals-by-party> 
       <party>Democratic</party> 
       <yea-total>0</yea-total> 
       <nay-total>168</nay-total> 
       <present-total>0</present-total> 
       <not-voting-total>5</not-voting-total> 
      </totals-by-party> 
      <totals-by-party> 
       <party>Independent</party> 
       <yea-total>0</yea-total> 
       <nay-total>0</nay-total> 
       <present-total>0</present-total> 
       <not-voting-total>0</not-voting-total> 
      </totals-by-party> 
      <totals-by-vote> 
        <total-stub>Totals</total-stub> 
        <yea-total>234</yea-total> 
        <nay-total>172</nay-total> 
        <present-total>1</present-total> 
        <not-voting-total>8</not-voting-total> 
      </totals-by-vote> 
     </vote-totals> 
    </vote-metadata> 
    <vote-data> 
     <recorded-vote> 
      <legislator name-id="A000374" sort-field="Abraham" unaccented-name="Abraham" party="R" state="LA" role="legislator">Abraham</legislator> 
      <vote>Yea</vote> 
     </recorded-vote> 
     <recorded-vote> 
      <legislator name-id="A000370" sort-field="Adams" unaccented-name="Adams" party="D" state="NC" role="legislator">Adams</legislator> 
      <vote>Nay</vote> 
     </recorded-vote> 
     <recorded-vote> 
      <legislator name-id="A000055" sort-field="Aderholt" unaccented-name="Aderholt" party="R" state="AL" role="legislator">Aderholt</legislator> 
      <vote>Yea</vote> 
     </recorded-vote> 
    </vote-data> 
</rollcall-vote> 
+0

私の答えでは、 'DECLARE @ xmlString NVARCHAR(MAX)'を使っています。問題が発生した場合は、 'N '(単純な' VARCHAR(MAX) ')なしで同じものを試してみてください。私はディスク上のファイルの実際のエンコーディングにいくつかの問題を抱えています... – Shnugo

答えて

1

ただ、これにあなたの読書の一部を変更します。

--DECLARE @xmlString NVARCHAR(MAX)= --try one of these... 
DECLARE @xmlString VARCHAR(MAX)= 
(
SELECT BulkColumn 
FROM OPENROWSET (BULK ''C:\StackOverflow\xml' + REPLACE(STR(@Counter,3),' ','0') + '.xml'', SINGLE_BLOB) AS c 
); 
SET @xmlString=SUBSTRING(@xmlString,CHARINDEX(''<rollcall-vote>'',@xmlString,1),9999999); 

DECLARE @xml XML=CAST(@xmlString AS XML); 

これは最初の<rollcall-vote>まですべてを遮断し、その後、通常の文字列変数にあなたのファイルを読み込みます。この消去された文字列はXMLにキャストできます。残りは以前と同じように動作するはずです。

+0

それは働いた!私はすべてのデータを含む単一の大きなテーブルで終わった。私は彼らに別のテーブルにいてもらいたいと思っていました。私は残りの部分を理解するために最善を尽くします。 –

+0

@anangちょうど1つのヒント:ステージングテーブルは最終的なターゲットではありません...これはあなたがこれをやっている方法を意味します。そこにすべてを書いてください。いくつかの列(例: 'year')を追加し、ステージングテーブルからすべてのデータを最終的なターゲットテーブルに転送することが賢明かもしれません。 – Shnugo

+1

私はすべてを一歩一歩踏み出すと思います。最初に、私が望む他のすべてのデータ値を、xmlファイルの1つからどのように抽出し、クロスジョインを介してそのファイルに対して既に持っているものと組み合わせるかを試してみます。次に、その方法をすべてのファイルに同時に適用しようとします。最後に、ステージングテーブルからすべてのデータを最終的なターゲットテーブルに転送しようとします。 –

関連する問題