SQLSERVER 2005中使用sql语句对xml文件和其数据的进行操作(很全面)

–用sql多条可以将多条数据组成一棵xml树l一次插入

–将xml树作为varchar参数传入用

–insert xx select xxx from openxml() 的语法插入数据

———————————–导入,导出xml————————–

–1导入实例

–单个表

create table xmltable(name nvarchar(20),nowtime nvarchar(20))

declare @s as nvarchar(2000);

set @s = n”

<xmltables>

<xmltable name=”1″ nowtime=”1900-1-1″>0</xmltable>

<xmltable name=”2″ nowtime=”1900-1-1″>0</xmltable>

<xmltable name=”3″ nowtime=”1900-1-1″>0</xmltable>

<xmltable name=”4″ nowtime=”1900-1-1″>0</xmltable>

<xmltable name=”5″ nowtime=”1900-1-1″>0</xmltable>

</xmltables>”;

declare @idhandle as int ;

exec sp_xml_preparedocument @idhandle output, @s

insert into xmltable(name,nowtime)

select * from openxml(@idhandle,n”/xmltables/xmltable”)

with dbo.xmltable

exec sp_xml_removedocument @idhandle

select * from xmltable

———————–读入第二个表数据——————–

create table xmlta(name nvarchar(20),nowtime nvarchar(20))

declare @s as nvarchar(4000);

set @s =n”

<xmltables>

<xmltb name=”6″ nowtime=”1900-2-1″>0</xmltable>

<xmlta name=”11″ nowtime=”1900-2-1″>0</xmlta>

</xmltables>

”;

declare @idhandle as int ;

exec sp_xml_preparedocument @idhandle output, @s

insert into xmlta(name,nowtime)

select * from openxml(@idhandle,n”/xmltables/xmlta”)

with dbo.xmlta

exec sp_xml_removedocument @idhandle

select * from xmlta

drop table xmlta

———————–同时读入多表数据—————-

create table xmlta(name nvarchar(20),nowtime datetime)

create table xmltb(name nvarchar(20),nowtime datetime)

declare @s as nvarchar(4000);

set @s =n”

<xmltables>

<xmlta name=”1″ nowtime=”1900-2-1″>0</xmlta>

<xmltb name=”2″ nowtime=”1900-2-1″>0</xmltb>

</xmltables>

”;

–<xmlta ></xmlta> 则插入的数据为null

declare @idhandle as int ;

exec sp_xml_preparedocument @idhandle output, @s

–表a

insert into xmlta(name,nowtime)

select * from openxml(@idhandle,n”/xmltables/xmlta”)

with dbo.xmlta

–表b

insert into xmltb(name,nowtime)

select * from openxml(@idhandle,n”/xmltables/xmltb”)

with dbo.xmltb

exec sp_xml_removedocument @idhandle

select * from xmlta

select * from xmltb

drop table xmlta,xmltb

–生成xml文件单表

declare @xvar xml

set @xvar = (select * from xmltable for xml auto,type)

select @xvar

–1读取xml文件插入表中

declare @hdoc int

declare @doc xml

select @doc=bulkcolumn from (select *

from openrowset(bulk ”e:\xml.xml”,single_blob) a)b

exec sp_xml_preparedocument @hdoc output,@doc

select * into #temp

from openxml (@hdoc,n”/root/dbo.xmltable”)

with (name nvarchar(20),intro nvarchar(20))

exec sp_xml_removedocument @hdoc

–2读取xml文件插入表中

select * into #temp from openrowset(

bulk ”e:\xml.xml”,single_blob) as x

declare @hdoc int

declare @doc xml

select @doc=bulkcolumn from #temp

exec sp_xml_preparedocument @hdoc output,@doc

select * into #temp2

from openxml (@hdoc,n”/root/dbo.xmltable”)

with (name nvarchar(20),intro nvarchar(20))

exec sp_xml_removedocument @hdoc

/*

—空的处理

<dbo.xmltable name=”1″ intro=”” />

<dbo.xmltable name=”2″ />

<dbo.xmltable name=”3″ intro=”c” />

1

2 null

3 c

*/

drop table xmlt

————————————xml数据操作——————

–类型化的xml

create table xmlt(id int primary key, xcol xml not null)

–t-sql生成数据

insert into xmlt values(1,

”<xmltables>

<xmltable name=”1″ nowtime=”1900-1-1″>1</xmltable>

<xmltable name=”2″ nowtime=”1900-1-2″>2</xmltable>

<xmltable name=”3″ nowtime=”1900-1-3″>3</xmltable>

<xmltable name=”4″ nowtime=”1900-1-4″>4</xmltable>

<xmltable name=”5″ nowtime=”1900-1-5″>5</xmltable>

</xmltables>”)

–dataset生成数据

insert into xmlt values(2,

”<?xml version=”1.0″ encoding=”gb2312″ ?>

<xmltables>

<xmltable><name>1</name><nowtime>1900-1-1</nowtime>1</xmltable>

<xmltable><name>2</name><nowtime>1900-1-2</nowtime>2</xmltable>

<xmltable><name>3</name><nowtime>1900-1-3</nowtime>3</xmltable>

</xmltables>”)

–读取name=1 的節點,請使用

select xcol.query(”/xmltables/xmltable[@name=”1″]”) from xmlt where id =1

–读取name=1 的節點值,請使用

select xcol.query(”/xmltables/xmltable[@name=”1″]/text()”) from xmlt where id =1

–读取name=5 的name 屬性值,請使用

select xcol.query(”data(/xmltables/xmltable[@name])[5]”) from xmlt where id =1

–读取所有节点name

select nref.value(”@name”, ”varchar(max)”) lastname

from xmlt cross apply xcol.nodes(”/xmltables/xmltable”) as r(nref) where id=1

–读取所有节点nowtime

select nref.value(”@nowtime”, ”varchar(max)”) lastname

from xmlt cross apply xcol.nodes(”/xmltables/xmltable”) as r(nref) where id=1

select xcol.query(”data(/xmltables/xmltable[@name=5]/@nowtime)[1]”) from xmlt where id =1

–读取name=1 的name 屬性值

select xcol.value(”data(/xmltables/xmltable//name)[1]”,”nvarchar(max)”) from xmlt where id=2

–读取nowtime=1 的nowtime 屬性值

select xcol.value(”data(/xmltables/xmltable/nowtime)[1]”,”nvarchar(max)”) from xmlt where id=2

–select xcol.value(”data(/xmltables/xmltable[@name])[1]”,”nvarchar(max)”) from xmlt where id=2

——————————————函数使用—————-

–query()、exist()

select pk, xcol.query(”/root/dbo.xmltable/name”) from docs

select xcol.query(”/root/dbo.xmltable/name”) from docs

where xcol.exist (”/root/dbo.xmltable”) = 1

–modify()

update docs set xcol.modify(”

insert

<section num=”2″>

<heading>background</heading>

</section>

after (/doc/section[@num=1])[1]”)

–value()

select xcol.value(”data((/root/dbo.xmltable//name))[2]”,”nvarchar(max)”) from docs

where pk=3

–nodes()

select nref.value(”@name”, ”varchar(max)”) lastname

from xmlt cross apply xcol.nodes(”/xmltables/xmltable”) as r(nref)

–query()、value()、exist() 和nodes(),modify()

select cast(t.c as xml).query(”/root/dbo.xmltable/name”)

from openrowset(bulk ”e:\xml.xml”,single_blob) t(c)

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐