********************* 导入 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
解决方案 »
- 急急急急急急急急急急急急急急急急!!!查询问题
- 如何优化这句sql语句
- 请教一个权限设计的数据结构问题
- 连接数据库是odbc快呀?还是ado快呀?不明白?
- [紧急求助]SQLServer2000服务器1433端口改变后,客户端程序如何相应变化?
- 为何我的sql数据库中有些表格的列显示“(....)”
- 如何做到两台服务器的的数据同步!要具体说明
- 怎么样删除不会留下uid?
- 用POWERBUILDER怎样进行图片搜索
- 如何在 SQL SERVER 中用变量作表名 insert @table_name
- 请教各位,有没有SQL2000转到ACCESS的工具?多谢!
- 急。。。SQL语句中从一表向另一表中插入值的问题?
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
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
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 @idocgo--显示处理结果
select * from 作者表
select * from 类型表
select * from 书名列表--删除测试表
drop table 作者表,类型表,书名列表
再用段代码调用它,谢谢
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