视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Sqlserverxml类型操作
2020-11-09 07:37:48 责编:小采
文档


最基本的规则: xml类型的数据之间以及xml类型与其它数据类型之间都是不能比较的,也就是说xml类型的数据不能出现在等号的任何一边。 对 咱们数据库来说,本来是不想让大家使用XML的数据类型的。既然这东西很好用,而且平台和各个产品线都在使用这个数据类型

最基本的规则:
xml类型的数据之间以及xml类型与其它数据类型之间都是不能比较的,也就是说xml类型的数据不能出现在等号的任何一边。

对 咱们数据库来说,本来是不想让大家使用XML的数据类型的。既然这东西很好用,而且平台和各个产品线都在使用这个数据类型,对XML做以下要求:
1、 不允许批量更新XML数据。更新的时候,在Where 条件句里面必须要加上条件,如:userid.
2、不允许批量查询XML类型的。查询 也需要在Where条件句上加上条件,如userid。在加上xml数据的条件。

查询类
1. query()方法:返回满足条件的所有xml行。只能用于select子句当中。
2. value()方法:返回从xml节点中提取的标量值。必须在value()方法的第二个参数中指定所返回的标量的数据类型,所以value()方法可以 与其它标量进行比较。可用于select子句和where子句。
3. exist()方法:返回int型标量的0或者1。对每行的xml数据类型进行存在性检查。可用于select子句和where子句。
4. nodes()方法:返回只有一个栏位的table,且该table的栏位是xml数据类型。所以nodes()方法只能出现在from子句中。

修 改类:
modify()
modify(insert .....)
modify(delete .....)
modify(replace ....)

用公司的 beisenuser 数据库里面的AssessmentUserTestResult 表做试验。

--查询函数
select ID,fk_beisenuser_id,Result
--select *
from AssessmentUserTestResult
where ID = 1
--查询
--query()方法
--查询 part节点所有xml数据
select id,fk_beisenuser_id,result.query('/TestResult/test/partlist/part')
from AssessmentUserTestResult
where ID = 2

select id,fk_beisenuser_id,result.query('/TestResult/test/partlist/part/starttime')
from AssessmentUserTestResult
where ID = 2

select id,fk_beisenuser_id,result.query('/TestResult/test/partlist/part/questionlist/question')
from AssessmentUserTestResult
where ID = 2

select id,fk_beisenuser_id,result.query('/TestResult/test/partlist/part/questionlist/question[1]')
from AssessmentUserTestResult
where ID = 2

select id,fk_beisenuser_id,result.query('/TestResult/test/partlist/part/questionlist/question[2]')
from AssessmentUserTestResult
where ID = 2

--value()方法

select id,fk_beisenuser_id,result.value('(/TestResult/test/partlist/part/starttime)[1]','datetime') as starttime
from AssessmentUserTestResult
where ID = 2

select Result.value('(/TestResult/test/partlist/part/questionlist/question[1]/id)[1]','varchar(500)')
from AssessmentUserTestResult
where ID = 2

select *
from AssessmentUserTestResult
where Result.value('(/TestResult/test/partlist/part/questionlist/question/id)[1]','uniqueidentifier') = '2142FF59-BBCA-4D30-8325-F1885EE109'
and ID = 2

select *
from AssessmentUserTestResult
where Result.value('(/TestResult/test/partlist/part/questionlist/question[2]/id)[1]','uniqueidentifier') = '68A0D7B3-CF21-4BB4-91C0-F93D0AB35F09'
and ID = 2

--exist() 方法

select *
from AssessmentUserTestResult
where Result.exist('(/TestResult/test/partlist/part/questionlist/question[1]/result)')= 1
and id = 2

--node()方法

--何老板可能会对下面这个结果感兴趣。


select b.loc.query('.')
from AssessmentUserTestResult a
cross apply result.nodes('/TestResult/test/partlist/part/questionlist/question') as b(loc)
where a.ID = 2

--修改数据
--在part节点内部插入xml数据

--modify(insert) 参数 as first,as last,before,after
update AssessmentUserTestResult
set Result.modify('
insert

aaaaaa-27E7-4240-8455-bbbbbbbbbbbbb
1

into (/TestResult/test/partlist/part)[1]'
)
where ID = 1
-------------------
update AssessmentUserTestResult
set Result.modify('
insert

aaaaaa-27E7-4240-8455-bbbbbbbbbbbbb
1

as last into (/TestResult/test/partlist/part)[1]'
)
where ID = 1


--modify(delete)
--
-- 删除内容
update AssessmentUserTestResult
set Result.modify('
delete (/TestResult/test/partlist/part/questionlist/question)[1]/id/text()'
)
where ID = 1

--删除节点

update AssessmentUserTestResult
set Result.modify('
delete (/TestResult/test/partlist/part/questionlist/question[1]/id)[1]'
)
where ID = 1

--删除属性

update AssessmentUserTestResult
set Result.modify('
delete (/TestResult/test/partlist/part/questionlist/question[1]/@category)[1]'
)
where ID = 1

select result.query('(/TestResult/test/partlist/part/questionlist/question)[1]')
from AssessmentUserTestResult
where ID = 1

--modify(replace)
-- 替换内容

select result.query('(/TestResult/test/partlist/part/questionlist/question[2])')
from AssessmentUserTestResult
where ID = 1

update AssessmentUserTestResult
set Result.modify('
replace value of (/TestResult/test/partlist/part/questionlist/question[2]/result[1]/text())[1]
with ("4")'
)
where ID = 1

/*
--替换属性
update AssessmentUserTestResult
set Result.modify('
replace value of (/TestResult/test/partlist/part/questionlist/question[2]/@result)[1]
with ("aaaaa")'
)
where ID = 1

*/

----------------------------------------------------------------------------无耻的分割-------------------------------------------------------------

declare @personid int ,@wdid uniqueidentifier,@value int

declare my_cursor cursor for
select perid,wdid,value from temp_duoyu
open my_cursor
fetch next from my_cursor into @personid,@wdid,@value
while @@FETCH_STATUS = 0
begin

update a
set testcent.modify('
replace value of (/TestCent/test[4]/level1originalcent/centlist[id=sql:variable("@wdid")]/value/text())[1]
with sql:variable("@value")
')
from AssessmentUserTestResult a
where a.ID = @personid

fetch next from my_cursor into @personid,@wdid,@value
end
close my_cursor
deallocate my_cursor

----------------------------------------------------------------------------无耻的分割-------------------------------------------------------------

下载本文
显示全文
专题