2017-02-22 26 views
2

Я довольно новичок в этом, поэтому, пожалуйста, несите меня. Я пытаюсь передать много файлов XML в Microsoft SQL Server за один раз. К сожалению, я получаю сообщение о том, что мне нужно преобразовать с опцией стиля 2. Я не знаю, как это сделать для большого количества файлов.Использование Convert Style Option 2 для большого количества XML-файлов сразу в Microsoft SQL Server

Вот мой запрос:

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; 

Что мне нужно каким-то образом решить эту проблему, которая будет иметь дело со всеми файлами одновременно. Ошибки, говорящие о том, что он не может загружать маску из-за не существующего файла, не являются проблемой, поскольку эти файлы на самом деле не существуют. На приведенном ниже рисунке ошибки, которые имеют значение, имеют символ, расположенный рядом с ними в фиолетовом. Однако это не единственные. Их сотни. Это лишь те из них, что я прокрутил. Два типа ошибок, которые вы видите ниже, являются единственными, которые дали выполнение моего запроса.

the screenshot of my errors

файлы все содержат одинаковые столбцы, одни и те же типы данных, но различные значения для столбцов. Ниже приведена детская версия одного такого XML-документа.

<?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)'. Если вы получаете проблемы, попробуйте использовать gthe без '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 Только один намек: промежуточная таблица не является конечной целью ... Это означает, что вы это делаете. Напиши все там, может быть умно, чтобы добавить еще несколько столбцов (например, «год»), а затем перенести все данные из промежуточной таблицы в конечную целевую таблицу (таблицы). – Shnugo

+1

Думаю, я сделаю все шаг за шагом. Сначала я попытаюсь выяснить, как извлечь все остальные значения данных из одного из моих xml-файлов и объединить их с тем, что у меня уже есть для этого файла, с помощью crossjoin. Затем я попытаюсь применить этот метод ко всем файлам одновременно. И, наконец, я попытаюсь перенести все данные из моей промежуточной таблицы в мои конечные целевые таблицы. –