从包含 XML 的列中获取值
Fetch a value from a column which contains XML
如何从 SQL 服务器中包含 XML 的列中获取值?
下面是我的示例 XML 列值,id 可以随时交换 (101,100) 或 (201,100,101,321)。
<Questions>
<item id="101">Yes</item>
<item id="100">No</item>
</Questions>
我想根据 Id 获取一个值。就像从 id=101
中获取 Yes
。
非常感谢示例代码。
我尝试使用以下示例,但无法检索值“是”
select Y.value('@item[1]','varchar[3]') as valT from tbl_storeXML s cross apply s.Questions.nodes('Questions/item') as X(Y) where e.empId=256 and Y.value('@id','int')=101
请帮忙解决这个问题。
Ps。这不是家庭作业,我正在学习在 sql 服务器中处理 xml。
value
的使用不正确,您是:
Y.value('@id','int')
这应该是:Y.value('(@id)[1]','int')
- 围绕
@id
的圆括号,参见:docs: value() Method
和Y.value('item[1]','varchar[3]')
.
这应该是:Y.value('(@item)[1]','varchar(3)')
.
删除了 @
因为 item
不是属性
varchar
应该有圆括号,而不是方括号。
你的试试,修改后会变成:
select
Y.value('(item)[1]','varchar(3)') as valT
from tbl_storeXML s
cross apply s.Questions.nodes('Questions/item') as X(Y)
where e.empId=256 and Y.value('(@id)','int')=101
这个没有测试,因为我没有那些表。 (我确实认为 Y.value('(item)[1]','varchar(3)')
可能需要写成 Y.value('(.)[1]','varchar(3)')
)
但是在这个DBFIDDLE
中可以看到同样的做法
DECLARE @xml XML = '<Questions>
<item id="101">Yes</item>
<item id="100">No</item>
</Questions>';
select
X.y.value('(@id)[1]','VARCHAR(20)') id,
X.y.value('(.)[1]','VARCHAR(20)') value
from @xml.nodes('Questions/item') as X(y);
输出:
id
value
101
Yes
100
No
如何从 SQL 服务器中包含 XML 的列中获取值? 下面是我的示例 XML 列值,id 可以随时交换 (101,100) 或 (201,100,101,321)。
<Questions>
<item id="101">Yes</item>
<item id="100">No</item>
</Questions>
我想根据 Id 获取一个值。就像从 id=101
中获取 Yes
。
非常感谢示例代码。
我尝试使用以下示例,但无法检索值“是”
select Y.value('@item[1]','varchar[3]') as valT from tbl_storeXML s cross apply s.Questions.nodes('Questions/item') as X(Y) where e.empId=256 and Y.value('@id','int')=101
请帮忙解决这个问题。 Ps。这不是家庭作业,我正在学习在 sql 服务器中处理 xml。
value
的使用不正确,您是:
Y.value('@id','int')
这应该是:Y.value('(@id)[1]','int')
- 围绕
@id
的圆括号,参见:docs: value() Method
和Y.value('item[1]','varchar[3]')
.
这应该是:Y.value('(@item)[1]','varchar(3)')
.
删除了
@
因为item
不是属性varchar
应该有圆括号,而不是方括号。
你的试试,修改后会变成:
select
Y.value('(item)[1]','varchar(3)') as valT
from tbl_storeXML s
cross apply s.Questions.nodes('Questions/item') as X(Y)
where e.empId=256 and Y.value('(@id)','int')=101
这个没有测试,因为我没有那些表。 (我确实认为 Y.value('(item)[1]','varchar(3)')
可能需要写成 Y.value('(.)[1]','varchar(3)')
)
但是在这个DBFIDDLE
中可以看到同样的做法DECLARE @xml XML = '<Questions>
<item id="101">Yes</item>
<item id="100">No</item>
</Questions>';
select
X.y.value('(@id)[1]','VARCHAR(20)') id,
X.y.value('(.)[1]','VARCHAR(20)') value
from @xml.nodes('Questions/item') as X(y);
输出:
id | value |
---|---|
101 | Yes |
100 | No |