大家来看看这个SQL SERVER导入XML文件的问题,请大家帮帮忙了

zhang865 2003-11-21 10:06:52
我的需求是这样的,我有大量的XML文件,这些XML文件是我要往数据库中导的原始数据资料,(我的一个XML文件中是一本书的内容,包括书的作者、类型和内容),现在我要把这些数据放到数据库中(SQL SERVER)的表中,我想问一下我该怎么把这些批量文件放到数据库中的表中呢。

我的XML文件格式如下:
<LanguageSource>
<Book>
<type>报告文学</type>
<author>不详</author>
<title>不详</title>
<context>
<chapter>
<title>不详1</title>
<doc>不详1</doc>
</chapter>
<chapter>
<title>不详2</title>
<doc>不详2</doc>
</chapter>
</context>
</Book>
</LanguageSource>

我的表结构如下:
作者表:作者ID、作者名字、作者介绍
类型表:类型ID、类型名
书名列表:书名ID、作者ID、类型ID、书名(也就是XML中的第一个TITLE)
内容表:内容ID、书名ID、章节TITLE(也就是XML文件中的context中的title)、内容(也就是XML文件中的doc)
...全文
153 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang865 2003-11-21
  • 打赏
  • 举报
回复
我第一次搞数据库,就碰到了这么棘手的问题,一下在摸不到头脑呀
zjcxc 2003-11-21
  • 打赏
  • 举报
回复
当然不是,你可以这样改下.以作者表为例

declare @作者ID int,@类型ID int

declare @作者 varchar(50)
SELECT @作者=作者名字 FROM OPENXML (@idoc, '/LanguageSource/Book',2)
WITH (
作者名字 varchar(50) 'author'
)
select @作者id=作者id from 作者表 where 作者名字=@作者名字
if @作者id is null
begin
insert into 作者表(作者名字) values(@作者名字)
set @作者id=@@identity
end
zhang865 2003-11-21
  • 打赏
  • 举报
回复
zjcxc(邹建)兄:根据我的实际情况(我的一个XML文件是一本书,但是因为一个作者可能有多本书,这样的话,如果每读一XML文件,就会读出一作者,一类型等等),这样在导入的时候是不是SQL SERVER会自动处理 相同的作者不会增加记录。

不知道我说的明白不明白
zzhig 2003-11-21
  • 打赏
  • 举报
回复
将这些SQL代码再写成一个大的存储过程吧
再用段代码调用它,谢谢
zjcxc 2003-11-21
  • 打赏
  • 举报
回复
--下面是插和数据到表的处理例子

DECLARE @idoc int,@doc varchar(8000)

--从文件中读出XML内容到临时表
create table #tb (doc varchar(8000))
bulk insert #tb from 'c:\a.xml'

--将读取到的数据保存到变量中
set @doc=''
select @doc=@doc+doc from #tb

--删除临时表
drop table #tb

/*
SET @doc ='
<?xml version=''1.0'' encoding="gb2312"?>
<LanguageSource>
<Book>
<type>报告文学</type>
<author>不详</author>
<title>不详</title>
<context>
<chapter>
<title>不详1</title>
<doc>不详1</doc>
</chapter>
<chapter>
<title>不详2</title>
<doc>不详2</doc>
</chapter>
</context>
</Book>
</LanguageSource>'
--*/


EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

--创建测试的表
create table 作者表(作者ID int identity(1,1),作者名字 varchar(50),作者介绍 varchar(50))
create table 类型表(类型ID int identity(1,1),类型名 varchar(50))
create table 书名列表(书名ID int identity(1,1),作者ID int,类型ID int,书名 varchar(50))

--下面是数据处理
declare @作者ID int,@类型ID int

--作者表:作者ID、作者名字、作者介绍
insert 作者表(作者名字)
SELECT * FROM OPENXML (@idoc, '/LanguageSource/Book',2)
WITH (
作者名字 varchar(50) 'author'
)
set @作者id=@@identity

--类型表:类型ID、类型名
insert into 类型表(类型名)
SELECT * FROM OPENXML (@idoc, '/LanguageSource/Book',2)
WITH (
类型名 varchar(50) 'type'
)
set @类型ID=@@identity

--书名列表:书名ID、作者ID、类型ID、书名(也就是XML中的第一个TITLE)
insert into 书名列表(作者ID,类型ID,书名)
SELECT @作者ID,@类型ID,* FROM OPENXML (@idoc, '/LanguageSource/Book',2)
WITH (
书名 varchar(50) 'title'
)

EXEC sp_xml_removedocument @idoc

go

--显示处理结果
select * from 作者表
select * from 类型表
select * from 书名列表

--删除测试表
drop table 作者表,类型表,书名列表
zzhig 2003-11-21
  • 打赏
  • 举报
回复
可不可以
zjcxc 2003-11-21
  • 打赏
  • 举报
回复
--对于你的XML,就是类似下面的处理.只是查询的例子

DECLARE @idoc int,@doc varchar(8000)

--从文件中读出XML内容到临时表
create table #tb (doc varchar(8000))
bulk insert #tb from 'c:\a.xml'

--将读取到的数据保存到变量中
set @doc=''
select @doc=@doc+doc from #tb

--删除临时表
drop table #tb

/*--如果只是测试,不是从文件中读取,就用这个,直接赋值
SET @doc ='
<?xml version=''1.0'' encoding="gb2312"?>
<LanguageSource>
<Book>
<type>报告文学</type>
<author>不详</author>
<title>不详</title>
<context>
<chapter>
<title>不详1</title>
<doc>不详1</doc>
</chapter>
<chapter>
<title>不详2</title>
<doc>不详2</doc>
</chapter>
</context>
</Book>
</LanguageSource>'
--*/


EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

--作者表:作者ID、作者名字、作者介绍
SELECT * FROM OPENXML (@idoc, '/LanguageSource/Book',2)
WITH (
作者名字 varchar(50) 'author'
)
--类型表:类型ID、类型名
SELECT * FROM OPENXML (@idoc, '/LanguageSource/Book',2)
WITH (
类型名 varchar(50) 'type'
)

--书名列表:书名ID、作者ID、类型ID、书名(也就是XML中的第一个TITLE)
SELECT * FROM OPENXML (@idoc, '/LanguageSource/Book',2)
WITH (
作者ID varchar(50) 'author',
类型ID varchar(50) 'type',
书名 varchar(50) 'title'
)

EXEC sp_xml_removedocument @idoc
zhang865 2003-11-21
  • 打赏
  • 举报
回复
还有就是一个作者有多本书,一个类型也有多本书,而一本书有一个或者多个章节,
zjcxc 2003-11-21
  • 打赏
  • 举报
回复
--参考:
DECLARE @idoc int,@doc varchar(8000)

--从文件中读出XML内容到临时表
create table #tb (doc varchar(8000))
bulk insert #tb from 'c:\a.xml'

--将读取到的数据保存到变量中
set @doc=''
select @doc=@doc+doc from #tb

--删除临时表
drop table #tb

--/*
SET @doc ='
<?xml version=''1.0'' encoding="gb2312"?>
<进攻战斗命令>
<发文字号>19XX司作字第X号</发文字号>
<密级>X密</密级>
<发文单位标识>
<中国人民>中国人民</中国人民>
<解放军>解放军</解放军>
<标识>摩托化步兵第X师(命令)</标识>
</发文单位标识>
<标题>XX地区进攻战斗</标题>
<地图和年版>地图1:30万 19xx年版</地图和年版>
<主送单位>各团,集团军坦克师第1团、炮兵旅</主送单位>
<正文>
<段落>一,敌摩托化步兵第*师孤军冒进,进攻受阻,被迫于*月*日*时在**地区转入防御。(具体部署见敌情通报)。</段落>
<段落>二,集团军首长决心集中主要兵力兵器在**(**,**)至**(**,**)地段实施主要突破,向***(**,**)、**(**,**)、**(**,**)方向实施主要突击。首先歼灭**(**,**)、**(**,**)地域之敌,尔后歼灭**(**,**)、**(**,**)地域之敌,再向**(**,**)、**(**,**)方向发展进攻。</段落>
<段落>三,师基本指挥所、预备指挥所、后方指挥所于*日*时*分前分别在**(**,**)、**(**,**)、**(**,**)开设完毕。</段落>
</正文>
<附件>附:摩托化步兵第X师行军计划(略)</附件>
<署名列表>
<署名>师 长 : X X X </署名>
<署名>政治委员: X X X </署名>
<署名>参 谋 长: X X X </署名>
</署名列表>
<成文时间>19XX年X月X日X时X分于XXX</成文时间>
<承办单位>承办单位:作训科</承办单位>
</进攻战斗命令>
'
--*/


EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

--第一层--父表
SELECT * FROM OPENXML (@idoc, '/进攻战斗命令',2)
WITH (
发文字号 varchar(50)
,密级 varchar(50)
,发文单位标识 varchar(10)
,标题 varchar(50)
,地图和年版 varchar(50)
,主送单位 varchar(50)
,正文 varchar(10)
,附件 varchar(50)
,署名 varchar(10)
,成文时间 varchar(50)
,承办单位 varchar(50)
)

--第二层--发文单位标识
SELECT * FROM OPENXML (@idoc, '/进攻战斗命令/发文单位标识',2)
WITH (
发文字号 varchar(50) '../发文字号',
中国人民 varchar(100),
解放军 varchar(100),
标识 varchar(50)
)

--第二层--正文
SELECT * FROM OPENXML (@idoc, '/进攻战斗命令/正文/段落',2)
WITH (
发文字号 varchar(50) '/进攻战斗命令/发文字号',
段落 varchar(8000) '.'
)

--第二层--署名
SELECT * FROM OPENXML (@idoc, '/进攻战斗命令/署名列表/署名',2)
WITH (
发文字号 varchar(50) '/进攻战斗命令/发文字号',
署名 varchar(50) '.'
)

EXEC sp_xml_removedocument @idoc
zhang865 2003-11-21
  • 打赏
  • 举报
回复
大哥:你写的东东是什么,我看不明白呀。能具体点么
zhang865 2003-11-21
  • 打赏
  • 举报
回复
这样导入XML数据应该用什么样的工具呢?或者是方法?因为我的文件很大,一般的也就600K,大的有2M,所以我用XML解析类分析出数据后再以增加记录的方法的话,会很慢很慢的。可能是因为XML解析类解析的过程所用的时间很长的,我想知道我应该怎么做。

真的希望能得到帮助,谢谢了先,不管是否回答我。
txlicenhe 2003-11-21
  • 打赏
  • 举报
回复

********************* 导入 xml 文件

DECLARE @idoc int
DECLARE @doc varchar(1000)
--sample XML document
SET @doc ='
<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
white red">
<Urgency>Important</Urgency>
Happy Customer.
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>
'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 1)
WITH (oid char(5),
amount float,
comment ntext 'text()')
EXEC sp_xml_removedocument @idoc

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧