sql server xml数据批量修改问题、、在线等!!!

madee123 2012-11-05 02:34:59
declare @col xml
set @col='<FlowTemplate Id="1c4f6937-d971-41f2-9b9c-2b502bf2b3bf" Name="keith20080630" Description="">
<FlowDocument Id="acee25f3-3fcb-48e9-aa02-0634a046ffc8" PageCount="0">
<FlowPage>
<ContentZone />
</FlowPage>
</FlowDocument>
<FlowActionProperty>
<ConvertToPdfProperty OcrLanguages="EN" Index="0" Action="good" />
<ImportToParaDocProperty UserName="" PassWord="" Index="1" Action="ImportToParaDoc" />
</FlowActionProperty>
<FlowActionProperty>
<ConvertToPdfProperty OcrLanguages="EN" Index="0" Action="good" />
<ImportToParaDocProperty UserName="" PassWord="" Index="1" Action="ImportToParaDoc" />
</FlowActionProperty>
<FlowActionProperty>
<ConvertToPdfProperty OcrLanguages="EN" Index="0" Action="good" />
<ImportToParaDocProperty UserName="" PassWord="" Index="1" Action="ImportToParaDoc" />
</FlowActionProperty>
<FlowProfile>
</FlowProfile>
</FlowTemplate>
'
set @col.modify('replace value of(/FlowTemplate/FlowActionProperty/ConvertToPdfProperty[@Action="good"]/@Action)[1] with "verygood"')

select @col


我想把Action="good"的节点都更改为Action="verygood" 可是现在不管怎样都只能修改第一条,谁有解决办法吗?
...全文
405 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄_瓜 2012-11-06
  • 打赏
  • 举报
回复
引用 10 楼 madee123 的回复:
引用 9 楼 Beirut 的回复:引用 3 楼 madee123 的回复:引用 2 楼 ky_min 的回复:SQL code12SET @col=CAST(REPLACE(CAST(@col AS VARCHAR(4000)),'Action="good"','Action="verygood"') AS XML)--REPLACE貌似可以达到效果这个不行的,我发的这……
还不如先解析xml 然后关联更新 然后在生成xml 来的快,你可以测一下。
madee123 2012-11-05
  • 打赏
  • 举报
回复
引用 9 楼 Beirut 的回复:
引用 3 楼 madee123 的回复:引用 2 楼 ky_min 的回复:SQL code12SET @col=CAST(REPLACE(CAST(@col AS VARCHAR(4000)),'Action="good"','Action="verygood"') AS XML)--REPLACE貌似可以达到效果这个不行的,我发的这个代码只是示例。真是数据需要使用wh……
谢谢你,没有自带的批量修改方法只好是用了游标。现在还不知道性能如何,待测试
declare @cur_userid varchar(30)
declare @cur_xml xml
declare userCur Cursor For Select user_id from #result group by user_id 
Open userCur
Fetch next From userCur Into @cur_userid
	select @cur_xml=resultXml from ExamineeAnswer where onlinetest_id=@onlinetest_id and user_id=@cur_userid
	print '@cur_xml1:'+cast(@cur_xml as varchar(max))
	Declare @test_question_Id int
	Declare @score decimal(8,2)
	Declare Cur Cursor For Select test_question_Id,score From #answerquestion  as q where @cur_userid=q.user_id   and dbo.fun_equlasAnswer(q.questionAnswer, q.examineeAnswer)=1
	Open Cur
	Fetch next From Cur Into @test_question_Id,@score
	While @@fetch_status=0     
	Begin
		set @cur_xml.modify('replace value of (ArrayOfAnswerXml/AnswerXml/src_score[../test_question_Id[text()=sql:variable("@test_question_Id")]]/text())[1] with sql:variable("@score")')
		Fetch Next From Cur Into  @test_question_Id,@score
	End   
	Close Cur   
	Deallocate Cur
	
	print '@cur_xml2:'+cast(@cur_xml as varchar(max))
	update ExamineeAnswer set resultXml=@cur_xml where onlinetest_id=@onlinetest_id and user_id=@cur_userid 
Close userCur   
Deallocate userCur
代码是这样的,查找出每个考生的试题答案,然后进行比较,正确就更改其对应分数 表结构是一个考试的每一个考生是一条记录,xml字段就存放考生该门考试所有的答案
黄_瓜 2012-11-05
  • 打赏
  • 举报
回复
引用 3 楼 madee123 的回复:
引用 2 楼 ky_min 的回复:SQL code12SET @col=CAST(REPLACE(CAST(@col AS VARCHAR(4000)),'Action="good"','Action="verygood"') AS XML)--REPLACE貌似可以达到效果这个不行的,我发的这个代码只是示例。真是数据需要使用where条件进行晒选。而且要替换的不一定都……
加 if 表达式
  • 打赏
  • 举报
回复
while exists(select @col.query('/FlowTemplate/FlowActionProperty/ConvertToPdfProperty[@Action="good"]')) begin set @col.modify('replace value of(/FlowTemplate/FlowActionProperty/ConvertToPdfProperty[@Action="good"]/@Action)[1] with "verygood"') select @col end
还在加载中灬 2012-11-05
  • 打赏
  • 举报
回复
引用 3 楼 madee123 的回复:
…而且要替换的不一定都是一样,…
这个加个case函数可以吗?再结合#6的方法
黄_瓜 2012-11-05
  • 打赏
  • 举报
回复
循环可以吗?
WHILE @col.exist('/FlowTemplate/FlowActionProperty/ConvertToPdfProperty[@Action="good"]') = 1 
      BEGIN 
            SET @col.modify('replace value of(/FlowTemplate/FlowActionProperty/ConvertToPdfProperty[@Action="good"]/@Action)[1] with "verygood"')
      END
madee123 2012-11-05
  • 打赏
  • 举报
回复
引用 4 楼 ssp2009 的回复:
modify修改必须是单个节点。你的要求办不到。
怎么会这样。。。功能都完成差不多了,,就剩这个修改啦。。好悲剧呀。
快溜 2012-11-05
  • 打赏
  • 举报
回复
modify修改必须是单个节点。你的要求办不到。
madee123 2012-11-05
  • 打赏
  • 举报
回复
引用 2 楼 ky_min 的回复:
SQL code12SET @col=CAST(REPLACE(CAST(@col AS VARCHAR(4000)),'Action="good"','Action="verygood"') AS XML)--REPLACE貌似可以达到效果
这个不行的,我发的这个代码只是示例。真是数据需要使用where条件进行晒选。而且要替换的不一定都是一样,aciton="good"可能替换成aciton="good1"或者aciton="good2"
还在加载中灬 2012-11-05
  • 打赏
  • 举报
回复
SET @col=CAST(REPLACE(CAST(@col AS VARCHAR(4000)),'Action="good"','Action="verygood"') AS XML)
--REPLACE貌似可以达到效果
madee123 2012-11-05
  • 打赏
  • 举报
回复
有用过的在吗?

22,210

社区成员

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

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