sql server从XML列获取特定数据

sql server从XML列获取特定数据,sql,sql-server,xml,xquery,Sql,Sql Server,Xml,Xquery,各位朋友,我在sql server 2014中有下表: 表[产品] 以下是每行的LeftMenu列中的XML示例: <menu> <e> <col>1</col> <url> /products/pressure-relief/pressure-relief-valves/general-info </url> <IDElement>General-Info </IDElement> </e&g

各位朋友,我在sql server 2014中有下表:

表[产品] 以下是每行的LeftMenu列中的XML示例:

<menu>
<e>
<col>1</col>
<url>
/products/pressure-relief/pressure-relief-valves/general-info
</url>
<IDElement>General-Info
</IDElement>
</e>
<e>
<col>2</col>
<url>
/products/pressure-relief/pressure-relief-valves/parts
</url>
<IDElement>parts
</IDElement>
</e>
</menu>
从给定的序列(主键)中,我想获得传递
标记值的节点
的值

这就像在XML中的每个
中搜索,并返回与该组元素匹配的
标记的值

我正在尝试以下方法,但不知何故它不起作用:

select p.serie, p.name,
pref.value('(col())[1]', 'varchar(max)') as MenuName,
from prodInfo p 
p.[left-menu].nodes('menu/e') as names  (pref)
WHERE  
pre.value('(IDElement())[1]', 'varchar(max)') == @IDElement
AND p.serie =@serie
你能告诉我怎么了吗

我的合作伙伴建议的另一个选择是像以前一样创建一个新表,而不是使用XML,有什么建议吗


谢谢大家!

我评论了说明零件的位置是第2列,或者我完全误解了您的要求

Declare @YourTable table (Series int,Name varchar(100),LeftMenu xml)
Insert Into @YourTable values
(1000,'Some Series Name','<menu><e><col>1</col><url>/products/pressure-relief/pressure-relief-valves/general-info</url><IDElement>General-Info</IDElement></e><e><col>2</col><url>/products/pressure-relief/pressure-relief-valves/parts</url><IDElement>parts</IDElement></e></menu>')

Declare @Fetch varchar(100) = 'Parts'

Select A.Series
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select  Col  = B.value('col[1]','int') 
                       ,Name = B.value('IDElement[1]','varchar(100)') 
                       ,URL  = B.value('url[1]','varchar(100)') 
                From LeftMenu.nodes('/menu') AS A(Grp)
                Cross Apply A.Grp.nodes('e') AS B(B)
                --Where  B.value('IDElement[1]','varchar(100)') = @Fetch
             ) B

你能以表格的形式添加预期的结果吗?谢谢,我已经用预期的结果更新了问题。示例没有返回值,我必须声明XML变量declare@XMLxml@franko_camron抱歉,我做了一个编辑,它应该是从LeftMenu.nodes('/menu')作为(Grp)@franko_camron更新的。谢谢你的关注。谢谢@john Cappelletti,它抛出了一个错误无效的列名“LeftMenu”,猜测是因为它超出了范围scope@franko_camron在这里运行干净-新窗口和所有。包含XML数据的字段名是什么
select p.serie, p.name,
pref.value('(col())[1]', 'varchar(max)') as MenuName,
from prodInfo p 
p.[left-menu].nodes('menu/e') as names  (pref)
WHERE  
pre.value('(IDElement())[1]', 'varchar(max)') == @IDElement
AND p.serie =@serie
Declare @YourTable table (Series int,Name varchar(100),LeftMenu xml)
Insert Into @YourTable values
(1000,'Some Series Name','<menu><e><col>1</col><url>/products/pressure-relief/pressure-relief-valves/general-info</url><IDElement>General-Info</IDElement></e><e><col>2</col><url>/products/pressure-relief/pressure-relief-valves/parts</url><IDElement>parts</IDElement></e></menu>')

Declare @Fetch varchar(100) = 'Parts'

Select A.Series
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select  Col  = B.value('col[1]','int') 
                       ,Name = B.value('IDElement[1]','varchar(100)') 
                       ,URL  = B.value('url[1]','varchar(100)') 
                From LeftMenu.nodes('/menu') AS A(Grp)
                Cross Apply A.Grp.nodes('e') AS B(B)
                --Where  B.value('IDElement[1]','varchar(100)') = @Fetch
             ) B
Series  Col Name            URL
1000    1   General-Info    /products/pressure-relief/pressure-relief-valves/general-info
1000    2   parts           /products/pressure-relief/pressure-relief-valves/parts