您的位置:首页 > 数据库

SQL 2005 对xml 文件与 xml数据的操作

2008-02-21 14:24 537 查看
网上转载 用来学习之用

由于数据库对xml数据直接处理有很多优势,05也对这方面加强了功能。

但这方面资料少,所以自己做了一些总结,希望会给大家带来帮助
--用SQL多条可以将多条数据组成一棵XML树L一次插入
--将XML树作为varchar参数传入用
--insert xx select xxx from openxml() 的语法插入数据
-----------------------------------导入,导出xml--------------------------

[align=left]--1导入实例[/align]
[align=left]--单个表[/align]
[align=left]--charry0110(晓风残月)[/align]
[align=left]create table Xmltable(Name nvarchar(20),Nowtime nvarchar(20))[/align]
[align=left]declare @s as nvarchar(2000);[/align]
[align=left]set @s = N'[/align]
[align=left]<Xmltables>[/align]
[align=left] <Xmltable Name="1" Nowtime="1900-1-1">0</Xmltable>[/align]
[align=left] <Xmltable Name="2" Nowtime="1900-1-1">0</Xmltable>[/align]
[align=left] <Xmltable Name="3" Nowtime="1900-1-1">0</Xmltable>[/align]
[align=left] <Xmltable Name="4" Nowtime="1900-1-1">0</Xmltable>[/align]
[align=left] <Xmltable Name="5" Nowtime="1900-1-1">0</Xmltable>[/align]
[align=left]</Xmltables>';[/align]
[align=left]declare @idHandle as int ; [/align]
[align=left]EXEC sp_xml_preparedocument @idHandle OUTPUT, @s[/align]
[align=left]insert into Xmltable(Name,Nowtime)[/align]
[align=left]select * from openxml(@idHandle,N'/Xmltables/Xmltable')[/align]
[align=left]with dbo.xmltable[/align]
[align=left]EXEC sp_xml_removedocument @idHandle[/align]
[align=left]select * from Xmltable[/align]
[align=left] [/align]
[align=left]-----------------------读入第二个表数据--------------------[/align]
[align=left]create table Xmlta(Name nvarchar(20),Nowtime nvarchar(20))[/align]
[align=left]declare @s as nvarchar(4000);[/align]
[align=left]set @s =N'[/align]
[align=left]<Xmltables>[/align]
[align=left] <Xmltb Name="6" Nowtime="1900-2-1">0</Xmltable>[/align]
[align=left] <Xmlta Name="11" Nowtime="1900-2-1">0</Xmlta>[/align]
[align=left]</Xmltables>[/align]
[align=left]';[/align]
[align=left]declare @idHandle as int ; [/align]
[align=left]EXEC sp_xml_preparedocument @idHandle OUTPUT, @s[/align]
[align=left]insert into Xmlta(Name,Nowtime)[/align]
[align=left]select * from openxml(@idHandle,N'/Xmltables/Xmlta')[/align]
[align=left]with dbo.xmlta[/align]
[align=left]EXEC sp_xml_removedocument @idHandle[/align]
[align=left]select * from Xmlta[/align]
[align=left]drop table Xmlta[/align]
[align=left] [/align]
[align=left]-----------------------同时读入多表数据----------------[/align]
[align=left]create table Xmlta(Name nvarchar(20),Nowtime datetime)[/align]
[align=left]create table Xmltb(Name nvarchar(20),Nowtime datetime)[/align]
[align=left]declare @s as nvarchar(4000);[/align]
[align=left]set @s =N'[/align]
[align=left]<Xmltables>[/align]
[align=left] <Xmlta Name="1" Nowtime="1900-2-1">0</Xmlta>[/align]
[align=left] <Xmltb Name="2" Nowtime="1900-2-1">0</Xmltb>[/align]
[align=left]</Xmltables>[/align]
[align=left]';[/align]
[align=left]--<Xmlta ></Xmlta> 则插入的数据为null[/align]
[align=left]declare @idHandle as int ; [/align]
[align=left]EXEC sp_xml_preparedocument @idHandle OUTPUT, @s[/align]
[align=left]--表a[/align]
[align=left]insert into Xmlta(Name,Nowtime)[/align]
[align=left]select * from openxml(@idHandle,N'/Xmltables/Xmlta')[/align]
[align=left]with dbo.Xmlta[/align]
[align=left]--表b[/align]
[align=left]insert into Xmltb(Name,Nowtime)[/align]
[align=left]select * from openxml(@idHandle,N'/Xmltables/Xmltb')[/align]
[align=left]with dbo.Xmltb[/align]
[align=left]EXEC sp_xml_removedocument @idHandle[/align]
[align=left]select * from Xmlta[/align]
[align=left]select * from Xmltb[/align]
[align=left]drop table Xmlta,Xmltb[/align]
[align=left]--生成xml文件单表[/align]
[align=left]DECLARE @xVar XML[/align]
[align=left]SET @xVar =(SELECT*FROM Xmltable FORXMLAUTO,TYPE)[/align]
[align=left]select @xVar[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]--1读取xml文件插入表中[/align]
[align=left]DECLARE @hdoc int[/align]
[align=left]DECLARE @doc xml[/align]
[align=left]select @doc=BulkColumn from (SELECT*[/align]
[align=left] FROMOPENROWSET(BULK'E:/xml.xml',SINGLE_BLOB) a)b[/align]
[align=left]EXECsp_xml_preparedocument @hdoc OUTPUT,@doc [/align]
[align=left]SELECT*into #temp[/align]
[align=left]FROMOPENXML(@hdoc,N'/root/dbo.xmltable')[/align]
[align=left]with (namenvarchar(20),Intro nvarchar(20))[/align]
[align=left]execsp_xml_removedocument @hdoc [/align]
[align=left]--2读取xml文件插入表中[/align]
[align=left]SELECT*into #temp FROMOPENROWSET([/align]
[align=left]BULK'E:/xml.xml',SINGLE_BLOB)AS x[/align]
[align=left]DECLARE @hdoc int[/align]
[align=left]DECLARE @doc xml[/align]
[align=left]select @doc=BulkColumn from #temp[/align]
[align=left]EXECsp_xml_preparedocument @hdoc OUTPUT,@doc [/align]
[align=left]SELECT*into #temp2[/align]
[align=left]FROMOPENXML(@hdoc,N'/root/dbo.xmltable')[/align]
[align=left]with (namenvarchar(20),Intro nvarchar(20))[/align]
[align=left]execsp_xml_removedocument @hdoc [/align]
[align=left]/*[/align]
[align=left]---空的处理[/align]
[align=left]<dbo.xmltable name="1" Intro="" /> [/align]
[align=left]<dbo.xmltable name="2" /> [/align]
[align=left]<dbo.xmltable name="3" Intro="c" /> [/align]
[align=left]1 [/align]
[align=left]2 NULL[/align]
[align=left]3 c[/align]
[align=left]*/[/align]
[align=left]droptable xmlt[/align]
[align=left]------------------------------------xml数据操作------------------[/align]
[align=left]--类型化的XML[/align]
[align=left]CREATETABLE xmlt(ID INTPRIMARYKEY, xCol XMLnotnull)[/align]
[align=left]--T-sql生成数据[/align]
[align=left]insertinto xmlt values(1,[/align]
[align=left]'<Xmltables>[/align]
[align=left] <Xmltable Name="1" NowTime="1900-1-1">1</Xmltable>[/align]
[align=left] <Xmltable Name="2" NowTime="1900-1-2">2</Xmltable>[/align]
[align=left] <Xmltable Name="3" NowTime="1900-1-3">3</Xmltable>[/align]
[align=left] <Xmltable Name="4" NowTime="1900-1-4">4</Xmltable>[/align]
[align=left] <Xmltable Name="5" NowTime="1900-1-5">5</Xmltable>[/align]
[align=left]</Xmltables>')[/align]
[align=left]--dataset生成数据[/align]
[align=left]insertinto xmlt values(2,[/align]
[align=left]'<?xml version="1.0" encoding="gb2312" ?> [/align]
[align=left]<Xmltables>[/align]
[align=left]<Xmltable><Name>1</Name><NowTime>1900-1-1</NowTime>1</Xmltable>[/align]
[align=left]<Xmltable><Name>2</Name><NowTime>1900-1-2</NowTime>2</Xmltable>[/align]
[align=left]<Xmltable><Name>3</Name><NowTime>1900-1-3</NowTime>3</Xmltable>[/align]
[align=left]</Xmltables>')[/align]
[align=left]--讀取Name=1 的節點,請使用[/align]
[align=left]SELECT xCol.query('/Xmltables/Xmltable[@Name="1"]')from xmlt where ID =1[/align]
[align=left]--讀取Name=1 的節點值,請使用[/align]
[align=left]SELECT xCol.query('/Xmltables/Xmltable[@Name="1"]/text()')from xmlt where ID =1[/align]
[align=left]--讀取Name=5 的Name 屬性值,請使用[/align]
[align=left]SELECT xCol.query('data(/Xmltables/Xmltable[@Name])[5]')from xmlt where ID =1[/align]
[align=left]--讀取所有节点Name[/align]
[align=left]SELECT nref.value('@Name','varchar(max)') LastName[/align]
[align=left]FROM xmlt CROSSAPPLY xCol.nodes('/Xmltables/Xmltable')AS R(nref)where ID=1[/align]
[align=left]--讀取所有节点NowTime[/align]
[align=left]SELECT nref.value('@NowTime','varchar(max)') LastName[/align]
[align=left]FROM xmlt CROSSAPPLY xCol.nodes('/Xmltables/Xmltable')AS R(nref)where ID=1[/align]
[align=left]SELECT xCol.query('data(/Xmltables/Xmltable[@Name=5]/@NowTime)[1]')from xmlt where ID =1[/align]
[align=left]--讀取Name=1 的Name 屬性值[/align]
[align=left]SELECT xCol.value('data(/Xmltables/Xmltable//Name)[1]','nvarchar(max)')FROM xmlt where ID=2[/align]
[align=left]--讀取NowTime=1 的NowTime 屬性值[/align]
[align=left]SELECT xCol.value('data(/Xmltables/Xmltable/NowTime)[1]','nvarchar(max)')FROM xmlt where ID=2[/align]
[align=left]--SELECT xCol.value('data(/Xmltables/Xmltable[@Name])[1]','nvarchar(max)') FROM xmlt where ID=2[/align]
[align=left]--讀取Name 屬性值 为一行[/align]
[align=left]SELECT xCol.query('for $Name in //Xmltable/@Name return string($Name)') from xmlt[/align]
[align=left]--1 2 3 4 5[/align]
[align=left]------------------------------------------函数使用----------------[/align]
[align=left]--query()、exist()[/align]
[align=left]SELECT pk, xCol.query('/root/dbo.xmltable/name')FROM docs[/align]
[align=left]SELECT xCol.query('/root/dbo.xmltable/name')FROM docs[/align]
[align=left]WHERE xCol.exist ('/root/dbo.xmltable')= 1[/align]
[align=left]--modify()[/align]
[align=left]UPDATE docs SET xCol.modify('[/align]
[align=left]insert [/align]
[align=left]<section num="2">[/align]
[align=left]<heading>Background</heading>[/align]
[align=left]</section> [/align]
[align=left]after (/doc/section[@num=1])[1]')[/align]
[align=left]--value()[/align]
[align=left]SELECT xCol.value('data((/root/dbo.xmltable//name))[2]','nvarchar(max)')FROM docs[/align]
[align=left]where pk=3[/align]
[align=left]--nodes()[/align]
[align=left]SELECT nref.value('@Name','varchar(max)') LastName[/align]
[align=left]FROM xmlt CROSSAPPLY xCol.nodes('/Xmltables/Xmltable')AS R(nref)[/align]
[align=left]--query()、value()、exist() 和nodes(),modify()[/align]
[align=left] SELECTCAST(T.c asxml).query('/root/dbo.xmltable/name')[/align]
[align=left] FROMOPENROWSET(BULK'E:/xml.xml',SINGLE_BLOB) T(c)[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐