Я довольно новичок в этом, поэтому, пожалуйста, несите меня. Я пытаюсь передать много файлов 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;
Что мне нужно каким-то образом решить эту проблему, которая будет иметь дело со всеми файлами одновременно. Ошибки, говорящие о том, что он не может загружать маску из-за не существующего файла, не являются проблемой, поскольку эти файлы на самом деле не существуют. На приведенном ниже рисунке ошибки, которые имеют значение, имеют символ, расположенный рядом с ними в фиолетовом. Однако это не единственные. Их сотни. Это лишь те из них, что я прокрутил. Два типа ошибок, которые вы видите ниже, являются единственными, которые дали выполнение моего запроса.
файлы все содержат одинаковые столбцы, одни и те же типы данных, но различные значения для столбцов. Ниже приведена детская версия одного такого 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>
В моем ответе я использую 'DECLARE @xmlString NVARCHAR (MAX)'. Если вы получаете проблемы, попробуйте использовать gthe без 'N' (простой' VARCHAR (MAX) '). У меня возникли проблемы с фактической кодировкой вашего файла на диске ... – Shnugo