【问题标题】:Read XML file into SQL Server database将 XML 文件读入 SQL Server 数据库
【发布时间】:2016-07-03 20:53:15
【问题描述】:

我正在尝试将一个 XML 文件读入一个已经存在的数据库表中。

问题在于 XML 标记和数据库列的名称不同,尽管它们具有相同的数据类型。因此,我想将 XML 标记“翻译”到数据库列中,以便对数据库的输入成为可能。

我不知道该怎么做。

这是我到目前为止所做的。

static void writeToDatabase()
{
    XmlDocument doc= new XmlDocument();

    try {
        // Reading the xml
        doc.Load("C:\\Temp\navetout.xml");

        DataTable dt = new DataTable();

        // Code here to read the xml into an already existing database table?
    } 
    catch (Exception e) 
    {
        Console.WriteLine(e.Message);
    }
}

数据库位于另一台服务器上,我已将其包含在 app.config

<connectionStrings>
    <add name="CS"
         connectionString="Data Source=tsrv2062;Initial Catalog=BUMS;Integrated Security=True"/>
 </connectionStrings>

假设 XML 文件具有标签“Name”,而数据库表列具有“Firstname”列。

XML 示例:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfFolkbokforingspostTYPE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FolkbokforingspostTYPE>
    <Sekretessmarkering xsi:nil="true" />
    <Personpost>
      <PersonId>
        <PersonNr>7527245452542</PersonNr>
      </PersonId>
      <HanvisningsPersonNr xsi:nil="true" />
      <Namn>
        <Tilltalsnamnsmarkering>20</Tilltalsnamnsmarkering>
        <Fornamn>skjdgnsdng</Fornamn>
        <Mellannamn xsi:nil="true" />
        <Efternamn>sdsdgsdgs</Efternamn>
        <Aviseringsnamn xsi:nil="true" />
      </Namn>
      <Folkbokforing>
        <Folkbokforingsdatum>20060512</Folkbokforingsdatum>
        <LanKod>56</LanKod>
        <KommunKod>77</KommunKod>
        <ForsamlingKod xsi:nil="true" />
        <Fastighetsbeteckning>PÅLNGE 6:38</Fastighetsbeteckning>
        <FiktivtNr>0</FiktivtNr>
      </Folkbokforing>
      <Adresser>
        <Folkbokforingsadress>
          <CareOf xsi:nil="true" />
          <Utdelningsadress1 xsi:nil="true" />
          <Utdelningsadress2>sgdsdgsdgs</Utdelningsadress2>
          <PostNr>78965</PostNr>
          <Postort>PÅLÄNG</Postort>
        </Folkbokforingsadress>
        <Riksnycklar>
          <FastighetsId>46464545</FastighetsId>
          <AdressplatsId>764846846</AdressplatsId>
          <LagenhetsId>45465654645</LagenhetsId>
        </Riksnycklar>
      </Adresser>
      <Fodelse>
        <HemortSverige>
          <FodelselanKod>00</FodelselanKod>
          <Fodelseforsamling>NEDERKALIX</Fodelseforsamling>
        </HemortSverige>
      </Fodelse>
      <Medborgarskap>
        <MedborgarskapslandKod>SE</MedborgarskapslandKod>
        <Medborgarskapsdatum>0</Medborgarskapsdatum>
      </Medborgarskap>
    </Personpost>
  </FolkbokforingspostTYPE>
</ArrayOfFolkbokforingspostTYPE>

这些是数据库表的列:

PersonalIdentityNumber
ProtectedIdentity
ReferedCivicRegistrationNumber
UnregistrationReason
UnregistrationDate
MessageComputerComputer
GivenNameNumber
FirstName
MiddleName
LastName
NotifyName
NationalRegistrationDate
NationalRegistrationCountyCode
NationalRegistrationMunicipalityCode
NationalRegistrationCoAddress
NationalRegistrationDistributionAddress1
NationalRegistrationDistributionAddress2
NationalRegistrationPostCode
NationalRegistrationCity
NationalRegistrationNotifyDistributionAddress
NationalRegistrationNotifyPostCode
NationalRegistrationNotifyCity
ForeignDistrubtionAddress1
ForeignDistrubtionAddress2
ForeignDistrubtionAddress3
ForeignDistrubtionCountry
ForeignDate
BirthCountyCode
BirthParish
ForeignBirthCity
CitizenshipCode
CitizenshipDate
Email
Telephone
Mobiletelephone
Gender
NotNewsPaper
Note
StatusCode
NationalRegistrationCode
RegistrationDate
LastUpdatedFromNavet
TemporaryDistrubtionAddress1
TemporaryDistrubtionAddress2
TemporaryDistrubtionAddress3
TemporaryDistrubtionCountry
Password
VisibilityLevel
LastChangedBy
LastChangedDate
SeamanIdentity
Category

这里举个例子,&lt;PersonNr&gt;标签和数据库列PersonalIdentityNumber是一样的。 与 XML 标记不匹配的列应该返回 null

在将 XML 数据读入数据库表之前,我想 XML-tags 必须被翻译成数据库表列。在这种情况下,“名字”。

谁能帮我解决这个“翻译”和读取数据库表的问题。

【问题讨论】:

  • “存储过程”I suggested you here 方法有什么问题?
  • 我需要从文件中读取 XML。
  • 正如我在那里告诉您的:您从 C# 应用程序中的文件中读取 XML 并将其传递给存储过程。 SP 将切碎 XML 并将所有数据插入到您指定的列中...
  • 但是你没有提到从 XML 文件中读取是如何发生的,这就是我想知道的。
  • 嗨,西蒙。您可能只做一个(C#)var xd=new XmlDocument(),然后使用Load() 方法。 You can read this。有几种方法可以做到这一点。

标签: sql-server xml tsql bulk-load


【解决方案1】:
DECLARE @xml XML
SELECT @xml = BulkColumn
FROM OPENROWSET(BULK 'D:\sample.xml', SINGLE_BLOB) x

SELECT
    t.c.value('(PersonId/PersonNr/text())[1]', 'VARCHAR(100)'),
    t.c.value('(Namn/Tilltalsnamnsmarkering/text())[1]', 'INT')
FROM @xml.nodes('*:ArrayOfFolkbokforingspostTYPE/*:FolkbokforingspostTYPE/*:Personpost') t(c)

【讨论】:

  • 如果 SQL Server 不在本地运行,这种方法的问题可能与文件系统权限有关。据我了解(并且已经有一个长期存在的相同问题stackoverflow.com/q/36016353/5089204),OP 希望使用 C# 应用程序读取 XML。因此,我建议通过...
  • @Shnugo 我的坏...错过了这个:(
【解决方案2】:

这就是我以前的做法。这不是解决方案,但您可以参考。

EXEC sp_xml_preparedocument @XML_OUT OUTPUT, @XML_DATA;

这里,@XML_DATA 是您传递的 XML 数据。 @XML_OUT 只是一个 INT 类型。

SELECT * INTO #TEMP
        FROM OPENXML(@XML_OUT,'DATA/INNER_TAG', 1)
        WITH
        (
            a VARCHAR(500),
            b VARCHAR(500),
            c INT,
            d VARCHAR(20)
        )

但这些name1、name2 等需要与XML 文件中的相同。 所以我使用INSERT INTO SELECT Query 将此数据插入到指定的表中。喜欢,

INSERT INTO OriginalTable
        (
            name1,
            name2,
            name3,
            name4
        )
        SELECT
            a
            b,
            c,
            d
        FROM #TEMP

【讨论】:

  • OPENXML 已过时。您应该使用 XML 方法,例如 .query().nodes().value() ...
  • 完全同意@Shnugo。另请注意,在某些情况下OPENXML 会导致内存泄漏(例如,如果您忘记运行sp_xml_removedocument
  • 严重吗,因为我忘记了sp_xml_removedocument
  • @Noobie,是的,如果你经常运行sp_xml_preparedocument
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2013-03-18
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多