MSSQL xml数据解析问题

qq_37400227 2017-09-16 06:35:10
DECLARE @inputStr xml
SET @inputStr = '<Request>
<tag>aaa</tag><tag_c>bbb</tag_c>
<tag>ccc</tag><tag_c>ddd</tag_c>
</Request>'

SELECT @inputStr.value('(/Request/tag)[1]','varchar(100)')
取到aaa
SELECT @inputStr.value('(/Request/tag)[2]','varchar(100)')
取到ccc

下标处能否使用变量.比如我要循环取,并不知道有多少个tag
...全文
321 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
道素 2017-09-21
  • 打赏
  • 举报
回复

DECLARE @inputStr xml
SET @inputStr = '<Request>
<tag>aaa</tag><tag_c>bbb</tag_c>
<tag>ccc</tag><tag_c>ddd</tag_c>
</Request>'
select x.node.value('local-name(.)','varchar(100)') as n ,x.node.value('.','varchar(100)') as v from @inputStr.nodes('Request/*') x(node)

  	n	v
tag          aaa
tag_c      bbb
tag          ccc
tag_c      ddd

kyupis 2017-09-20
  • 打赏
  • 举报
回复
上面取出tag数量,遍历可用二楼的
SELECT @inputStr
DECLARE @count int
SET @count=2;
SELECT @inputStr.query('/Request/tag[position()=sql:variable("@count")]')
kyupis 2017-09-20
  • 打赏
  • 举报
回复
SELECT @inputStr.value('count(//Request/tag)','int')
顺势而为1 2017-09-18
  • 打赏
  • 举报
回复


DECLARE @inputStr xml
SET @inputStr = '<Request>
<tag>aaa</tag><tag_c>bbb</tag_c>
<tag>ccc</tag><tag_c>ddd</tag_c>
</Request>'

Select T.C.value('.','varchar(40)')
from @inputStr.nodes('/Request/*') AS T(C)
Where T.C.value('local-name(.)','varchar(20)')='tag'

----------------------------------------
aaa
ccc

(2 row(s) affected)

听雨停了 2017-09-16
  • 打赏
  • 举报
回复

DECLARE @inputStr xml
SET @inputStr = '<Request>
<tag>aaa</tag><tag_c>bbb</tag_c>
<tag>ccc</tag><tag_c>ddd</tag_c>
</Request>'

DECLARE @idoc int 
EXEC sp_xml_preparedocument @Idoc OUTPUT, @inputStr  
SELECT [TEXT] FROM OPENXML (@Idoc, '/Request/tag',1) WHERE [text] IS NOT NULL 

TEXT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
aaa
ccc

(2 行受影响)
OwenZeng_DBA 2017-09-16
  • 打赏
  • 举报
回复
引用 楼主 qq_37400227 的回复:
DECLARE @inputStr xml SET @inputStr = '<Request> <tag>aaa</tag><tag_c>bbb</tag_c> <tag>ccc</tag><tag_c>ddd</tag_c> </Request>' SELECT @inputStr.value('(/Request/tag)[1]','varchar(100)') 取到aaa SELECT @inputStr.value('(/Request/tag)[2]','varchar(100)') 取到ccc 下标处能否使用变量.比如我要循环取,并不知道有多少个tag
可以用下面的办法@count就是下标
SELECT @inputStr
DECLARE @count int
SET @count=2;
SELECT @inputStr.query('/Request/tag[position()=sql:variable("@count")]')
用下面的方法可以取的总共有多少个tag
SET @count=1;
SET @totalCount=@data.value('count(/bookstore/book[1]/@*)','INT');
WHILE @count<=@totalCount

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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