将 XML 文件读入 SQL 服务器数据库
Read XML file into SQL Server database
我正在尝试将 XML 文件读入已存在的数据库 table。
问题是 XML 标记和数据库列的名称不同,尽管它们具有相同的数据类型。因此,我想将 "translate" 和 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”,而数据库 table 列有列“[=42” =]名字".
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>
这些是数据库的列 table:
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
这里举个例子,<PersonNr>
标签和数据库列PersonalIdentityNumber
是一样的。
与 XML 标签不匹配的列应该返回 null
.
在将 XML 数据读入数据库 table 之前,我想 XML 标签必须转换为数据库 table 列。在这种情况下,“名字”。
谁能帮我解决这个 "translation" 和读取数据库 table。
我以前就是这样做的。这不是一个解决方案,但你可以参考这个。
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
查询将此数据插入指定的 table。喜欢,
INSERT INTO OriginalTable
(
name1,
name2,
name3,
name4
)
SELECT
a
b,
c,
d
FROM #TEMP
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)
我正在尝试将 XML 文件读入已存在的数据库 table。
问题是 XML 标记和数据库列的名称不同,尽管它们具有相同的数据类型。因此,我想将 "translate" 和 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”,而数据库 table 列有列“[=42” =]名字".
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>
这些是数据库的列 table:
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
这里举个例子,<PersonNr>
标签和数据库列PersonalIdentityNumber
是一样的。
与 XML 标签不匹配的列应该返回 null
.
在将 XML 数据读入数据库 table 之前,我想 XML 标签必须转换为数据库 table 列。在这种情况下,“名字”。
谁能帮我解决这个 "translation" 和读取数据库 table。
我以前就是这样做的。这不是一个解决方案,但你可以参考这个。
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
查询将此数据插入指定的 table。喜欢,
INSERT INTO OriginalTable
(
name1,
name2,
name3,
name4
)
SELECT
a
b,
c,
d
FROM #TEMP
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)