[英]importing xml file with multiple attributes
我正在嘗試導入一個在子節點上具有多個屬性的xml文件,但似乎無法正常工作。
這是XML文件:
<?xml version="1.0" encoding="UTF-8" ?>
<SelectedPublications>
<Publication>
<ID>
15131585</ID>
<ReceiptLimitDate>
2018-03-05</ReceiptLimitDate>
<OpeningDate/>
<Regions>
<Region RegionID="2" RegionDescription="Belgie"/>
<Region RegionID="36" RegionDescription="Vlaams-Brabant"/>
</Regions>
<Classes>
<Class ClassID="889" ClassDescription="Erkenn. onbekend"/>
</Classes>
<Attachments>
<Attachment FileName="461616_2018-01-26 Minnepoortje BD1 uitbreiding sanitair P1.zip" FileLink="http://www.publicationdownloads.com/Enot/00297726/461616_2018-01-26 Minnepoortje BD1 uitbreiding sanitair P1.zip"/>
<Attachment FileName="2016-11-17 Minnepoortje verslag Vincotte.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2016-11-17 Minnepoortje verslag Vincotte.pdf"/>
<Attachment FileName="2017-01-30 Minnepoortje advies brandweer.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2017-01-30 Minnepoortje advies brandweer.pdf"/>
<Attachment FileName="2017-02-13 Minnepoortje BD1 sanitair EPB rapport.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2017-02-13 Minnepoortje BD1 sanitair EPB rapport.pdf"/>
<Attachment FileName="2017-03-15 Minnepoortje advies Infrax.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2017-03-15 Minnepoortje advies Infrax.pdf"/>
<Attachment FileName="2017-04-10 Minnepoortje vergunning.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2017-04-10 Minnepoortje vergunning.pdf"/>
<Attachment FileName="2017-04-14 Minnepoortje tek BT - 610X920.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2017-04-14 Minnepoortje tek BT - 610X920.pdf"/>
<Attachment FileName="2017-04-14 Minnepoortje tek INPL - 610X700.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2017-04-14 Minnepoortje tek INPL - 610X700.pdf"/>
<Attachment FileName="2017-10-13 Minnepoortje BD1 sanitair P1 offerteformulier.doc" FileLink="http://www.publicationdownloads.com/Enot/00297726/2017-10-13 Minnepoortje BD1 sanitair P1 offerteformulier.doc"/>
<Attachment FileName="2017-11-17 Minnepoortje VC Advies_ontwerp.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2017-11-17 Minnepoortje VC Advies_ontwerp.pdf"/>
<Attachment FileName="2017-11-17 Minnepoortje VC Bijlage VGP.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2017-11-17 Minnepoortje VC Bijlage VGP.pdf"/>
<Attachment FileName="2017-11-17 Minnepoortje VC VGP.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2017-11-17 Minnepoortje VC VGP.pdf"/>
<Attachment FileName="2018-01-24 Minnepoortje BD1 sanitair P1 adm bepalingen VOMVB.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2018-01-24 Minnepoortje BD1 sanitair P1 adm bepalingen VOMVB.pdf"/>
<Attachment FileName="2018-01-24 Minnepoortje BD1 sanitair P1 DM.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2018-01-24 Minnepoortje BD1 sanitair P1 DM.pdf"/>
<Attachment FileName="2018-01-24 Minnepoortje BD1 sanitair P1 LB.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2018-01-24 Minnepoortje BD1 sanitair P1 LB.pdf"/>
<Attachment FileName="2018-01-24 Minnepoortje BD1 sanitair P1 M aannemers.xlsx" FileLink="http://www.publicationdownloads.com/Enot/00297726/2018-01-24 Minnepoortje BD1 sanitair P1 M aannemers.xlsx"/>
<Attachment FileName="2018-01-24 Minnepoortje BD1 sanitair P1 SM inschrijving.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2018-01-24 Minnepoortje BD1 sanitair P1 SM inschrijving.pdf"/>
<Attachment FileName="2018-01-25 Minnepoortje tek NT 610X1200.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2018-01-25 Minnepoortje tek NT 610X1200.pdf"/>
<Attachment FileName="2018-01-25 Minnepoortje tek Ramenstaat A3.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/2018-01-25 Minnepoortje tek Ramenstaat A3.pdf"/>
<Attachment FileName="Minnepoortje aankoopvoorwaarden.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/Minnepoortje aankoopvoorwaarden.pdf"/>
<Attachment FileName="Minnepoortje asbestinventaris.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/Minnepoortje asbestinventaris.pdf"/>
<Attachment FileName="Minnepoortje grondsondering inplanting.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/Minnepoortje grondsondering inplanting.pdf"/>
<Attachment FileName="Minnepoortje grondsondering scouts.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/Minnepoortje grondsondering scouts.pdf"/>
<Attachment FileName="Minnepoortje kadaster.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/Minnepoortje kadaster.pdf"/>
<Attachment FileName="Minnepoortje nota plaatsbezoek.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/Minnepoortje nota plaatsbezoek.pdf"/>
<Attachment FileName="Minnepoortje toegangen.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/Minnepoortje toegangen.pdf"/>
<Attachment FileName="Minnepoortje werfzone.pdf" FileLink="http://www.publicationdownloads.com/Enot/00297726/Minnepoortje werfzone.pdf"/>
<Attachment FileName="F02 Avis de marché - Officiële tekst (29/01/2018)" FileLink="http://www.publicationdownloads.com/Enot/00297726/297726_0_0_nl-NL.pdf"/>
</Attachments>
<Title>
VRIJE BASISSCHOOL 'T MINNEPOORTJE ASSENT (BEKKEVOORT) - UITBREIDING BASISSCHOOL - BOUWDOSSIER 1: NIEUWBOUW SANITAIRE BLOK VOOR KLEUTERS - perceel 1: algemene bouwwerken</Title>
<Text>
<div lang="NL"><div class="ptxt"><br />Deze mededeling heeft betrekking op de publicatie van een: AANKONDIGING VAN EEN OPDRACHT <br />Uittreksel uit de officiële tekst.<br /><br />
<div class="ppar">AFDELING I. AANBESTEDENDE DIENST</div>
<br />I.1. Naam en adressen<br /><br />Officiële benaming : LABO architecten bvba<br />Postadres : Egide Alenusstraat 12 , BE - 3290 Diest<br />Contactpersoon: architect Marc Bex<br />Tel: +32 13315651<br />E-mail: marc.bex@laboarchitecten.be<br />Internetadres(sen): www.laboarchitecten.be https://enot.publicprocurement.be/enot-war/preViewNotice.do?noticeId=297726<br /><br />I.3. Communicatie<br /><br />Officiële benaming : LABO architecten bvba<br />Postadres : Egide Alenusstraat 12 ,BE -3290 Diest<br />Contactpersoon: 3290<br />Tel: +32 13315651<br />E-mail: marc.bex@laboarchitecten.be<br />Internetadres(sen): www.laboarchitecten.be www.laboarchitecten.be<br /><br />
<div class="ppar">AFDELING II. VOORWERP</div>
<br />II.1. Omvang van de aanbesteding<br /><br />II.1.1. Benaming<br /><b>VRIJE BASISSCHOOL 'T MINNEPOORTJE ASSENT (BEKKEVOORT) - UITBREIDING BASISSCHOOL - BOUWDOSSIER 1: NIEUWBOUW SANITAIRE BLOK VOOR KLEUTERS - perceel 1: algemene bouwwerken </b><br />Referentienummer: LABO architecten bvba-16.452-BD1-P1-F02_0<br />II.1.2. Voornaamste CPV-code : 45000000<br />II.1.3. Type opdracht : werken<br />II.1.4. Korte beschrijving<br />VRIJE BASISSCHOOL 'T MINNEPOORTJE ASSENT (BEKKEVOORT) - UITBREIDING BASISSCHOOL - BOUWDOSSIER 1: NIEUWBOUW SANITAIRE BLOK VOOR KLEUTERS - perceel 1: algemene bouwwerken<br />II.1.6. Inlichtingen over percelen<br />Verdeling in percelen: NEE<br /><br />II.2. Beschrijving<br /><br />II.2.3. Plaats van uitvoering<br />NUTS-code(s): BE242<br />Voornaamste plaats van uitvoering: Assent Bekkevoort<br />II.2.4. Beschrijving<br />VRIJE BASISSCHOOL 'T MINNEPOORTJE ASSENT (BEKKEVOORT) - UITBREIDING BASISSCHOOL - BOUWDOSSIER 1: NIEUWBOUW SANITAIRE BLOK VOOR KLEUTERS - perceel 1: algemene bouwwerken ruwbouw, winddicht, binnenafwerking, buitenaanleg, . geen technieken (= perceel2) info: marc.bex@laboarchitecten.be <br />II.2.5. Gunningscriteria<br />De prijs is niet het enige gunningscriterium en alle criteria worden enkel vermeld in de aanbestedingsdocumenten.<br />II.2.7. Looptijd<br />12 maand(en)<br />Verlenging mogelijk: NEE<br /><br /><br />
<div class="ppar">AFDELING III. JURIDISCHE, ECONOMISCHE, FINANCIELE EN TECHNISCHE INLICHTINGEN</div>
<br />III.1. Voorwaarden voor deelneming<br /><br />III.1.1 Geschikeid om de beroepsactiviteit uit te oefenen, waaronder de vereisten in verband met de inschrijving in het beroeps- of handelsregister<br />Lijst en beknopte beschrijving van de voorwaarden: <br />zie bestek<br /><br /><br />
<div class="ppar">AFDELING IV. PROCEDURE</div>
<br />IV.1.1 Proceduretype<br />Mededingingsprocedure met onderhandeling<br />Versnelde procedure: JA<br />Motivering<br /><br />IV.1.8 Inlichtingen over de Overeenkomst inzake overheidsopdrachten (GPA)<br />De opdracht valt onder de GPA: NEE<br /><br />IV.2 ADMINISTRATIEVE INLICHTINGEN:<br />IV.2.2 Termijn voor de ontvangst van blijken van belangstelling 2018-03-05 14:00<br />IV.2.4 Talen die mogen worden gebruikt bij het indienen van inschrijvingen of aanvragen tot deelneming : NL<br /><br /><br />
<div class="ppar">AFDELING VI. AANVULLENDE INLICHTINGEN</div>
<br /><br />VI.3. Nadere inlichtingen<br />- De aanbestedingsdocumenten kunnen kosteloos digitaal opgevraagd worden bij de ontwerper (marc.bex@laboarchitecten.be). - Plaatsbezoek school kan na telefonische afspraak metdirecteur Tom Vanderbiesen: 013 31 20 88 of 0495 21 00 63- Er is ook nog een BOUWDOSSIER2 "uitbreiding basisschool dmv optoppen op verdieping", zie aparte aankondiging<br /><br />VI.4 Beroepsprocedures<br /><br />VI.4.1 Beroepsinstantie<br />bevoegde rechtbanken , BE nvt<br /><br />VI.5 Datum van verzending van deze aankondiging<br />2018-01-29<br /></div>
</div></Text>
</Publication>
</SelectedPublications>
這是我正在使用的查詢,效果很好。
DECLARE @XmlFile XML
SELECT @XmlFile = BulkColumn
FROM OPENROWSET(BULK 'C:\Temp\GeoDynamics\Downloads\aanbest.xml', SINGLE_BLOB) x;
INSERT INTO Aanbest(ID, ReceiptLimitDate)
SELECT
ID = resource.value('(ID)[1]', 'varchar(50)'),
ReceiptLimitDate = resource.value('(ReceiptLimitDate)[1]', 'varchar(50)')
FROM
@XmlFile.nodes('//SelectedPublications/Publication') AS XTbl1(resource)
WHERE
NOT EXISTS (SELECT a.id FROM Aanbest a
WHERE resource.value('(ID)[1]', 'varchar(50)') = a.id)
現在的問題是,如何也可以導入附件鏈接? 每個xml文件可以具有不同數量的鏈接,最多30個。
我找到了解決方案,在SQL表中添加了足夠的附件列(例如,attachment1,attachment2等),然后使用@childnode填充列,請參見下文
DECLARE @XmlFile XML
SELECT @XmlFile = BulkColumn
FROM OPENROWSET(BULK 'C:\Temp\GeoDynamics\Downloads\aanbest.xml', SINGLE_BLOB) x;
INSERT INTO Aanbest(ID, ReceiptLimitDate, attachment1,attachment2,attachment3)
SELECT
ID = resource.value('(ID)[1]', 'varchar(50)'),
ReceiptLimitDate = resource.value('(ReceiptLimitDate)[1]', 'varchar(50)'),
Attachment1 = resource.value('(@Attachment)[1]', 'varchar(50)'),
Attachment2 = resource.value('(@Attachment)[2]', 'varchar(50)'),
Attachment3 = resource.value('(@Attachment)[3]', 'varchar(50)')
FROM
@XmlFile.nodes('//SelectedPublications/Publication') AS XTbl1(resource)
WHERE
NOT EXISTS (SELECT a.id FROM Aanbest a
WHERE resource.value('(ID)[1]', 'varchar(50)') = a.id)
您找到了自己的解決方案-太好了!
只是一些提示:
<ID>
(以及<Publication>
下的大多數其他元素)是-為什么要以換行符開頭(在您的情況下為CHAR(13)+CHAR(10)
),您正在將其導入為varchar(50)
。 將來您可能會遇到麻煩,無法以數字值(或日期值)來解決這個問題。
每當您覺得需要對列名稱進行編號時,這就很容易說明設計不良 。 是的,您可以在表中添加許多列,例如Attachment1, Attachment2, ...
,但這通常是錯誤的方法。
公平地說:在您的情況下,這可能是完美的方法,尤其是在導入目標是登台表的情況下。 但是您可以看看這種方法:
DECLARE @XmlFile XML='YourXmlHere';
-這是一個反映您的XML文件的模型表
- <Text>
是XHTML
因此我將其放入XML列
-並且我使用XQuery的substring
來切斷主要的換行符
-您也可以在讀取的值上使用T-SQL的REPLACE()
DECLARE @Aanbest TABLE(AanbestID INT,ReceiptLimitDate DATE,Title NVARCHAR(500),[Text] XML);
INSERT INTO @Aanbest(AanbestID,ReceiptLimitDate,Title,[Text])
SELECT @XmlFile.value(N'substring((/SelectedPublications/Publication/ID/text())[1],2)',N'int')
,@XmlFile.value(N'substring((/SelectedPublications/Publication/ReceiptLimitDate/text())[1],2)',N'date')
,@XmlFile.value(N'substring((/SelectedPublications/Publication/Title/text())[1],2)',N'nvarchar(500)')
,@XmlFile.value(N'substring((/SelectedPublications/Publication/Text/text())[1],2)',N'nvarchar(max)');
-區域為1:n
因此我將其導入到相關表中,您可以通過AanbestID
加入該表
-我使用.nodes()
獲取所有區域作為派生表
DECLARE @Regions TABLE(RegionID INT, AanbestID INT, RegionDescription NVARCHAR(100));
INSERT INTO @Regions(RegionID,AanbestID,RegionDescription)
SELECT A.r.value(N'@RegionID',N'int')
,@XmlFile.value(N'substring((/SelectedPublications/Publication/ID/text())[1],2)',N'int')
,A.r.value(N'@RegionDescription',N'nvarchar(100)')
FROM @XmlFile.nodes(N'/SelectedPublications/Publication/Regions/Region') AS A(r);
-與附件相同
--Here我使用ROW_NUMBER()
來動態創建一個運行編號(XML中的位置)
DECLARE @Attachments TABLE(AttachmentID INT, AanbestID INT, [FileName] NVARCHAR(500));
INSERT INTO @Attachments(AttachmentID,AanbestID,[FileName])
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
,@XmlFile.value(N'substring((/SelectedPublications/Publication/ID/text())[1],2)',N'int')
,A.a.value(N'@FileName',N'nvarchar(500)')
FROM @XmlFile.nodes(N'/SelectedPublications/Publication/Attachments/Attachment') AS A(a);
-現在檢查輸出:
SELECT * FROM @Aanbest;
SELECT * FROM @Regions;
SELECT * FROM @Attachments;
-或在聯合查詢中
SELECT *
FROM @Aanbest AS a
INNER JOIN @Attachments AS at ON a.AanbestID=at.AanbestID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.