Xml 在T-SQL nodes()XQuery中引用当前上下文
是否可以通过基于第一个调用的上下文节点过滤第二个Xml 在T-SQL nodes()XQuery中引用当前上下文,xml,tsql,xquery-sql,Xml,Tsql,Xquery Sql,是否可以通过基于第一个调用的上下文节点过滤第二个节点(),在两个T-SQL节点()之间实现连接 在下面的示例中,我试图返回一个表,其中显示PersonID、Name和Position。在第二个节点()XQuery语句中,我尝试引用第一个节点()的上下文节点的@id无效。不返回职位名称 有什么想法吗 谢谢大家! DECLARE @xml xml = '<Root> <People> <Person id="1">Frank</Pe
节点()
,在两个T-SQL节点()之间实现连接
在下面的示例中,我试图返回一个表,其中显示PersonID
、Name
和Position
。在第二个节点()
XQuery语句中,我尝试引用第一个节点()
的上下文节点的@id
无效。不返回职位名称
有什么想法吗
谢谢大家!
DECLARE @xml xml = '<Root>
<People>
<Person id="1">Frank</Person>
<Person id="2">Joe</Person>
</People>
<Positions>
<Position assignedToPerson="1">Engineer</Position>
<Position assignedToPerson="2">Manager</Position>
</Positions>
</Root>'
SELECT
PersonID = person.value('@id', 'NVARCHAR(50)'),
Name = person.value('.', 'NVARCHAR(50)'),
positionTitle = position.value('Position[1]', 'NVARCHAR(50)')
FROM
@xml.nodes('/Root/People/Person') People(person)
OUTER APPLY
@xml.nodes('/Root/Positions/Position[@assignedToPerson=.[@id]]') Positions(position)
DECLARE@xml='xml'
直率的
乔
工程师
经理
'
挑选
PersonID=person.value('@id',NVARCHAR(50)'),
Name=person.value(‘.’,‘NVARCHAR(50)’),
positionTitle=position.value('position[1],'NVARCHAR(50)'))
从…起
@节点('/Root/People/Person')人(Person)
外敷
@节点('/Root/Positions/Position[@assignedToPerson=.[@id]]')位置(Position)
使用按值连接而不是按节点交叉应用应该有效;投影中的positiontitle随后成为元素值(.):
DECLARE@xml='xml'
直率的
乔
工程师
经理
'
挑选
PersonID=person.value('@id',NVARCHAR(50)'),
Name=person.value(‘.’,‘NVARCHAR(50)’),
positionTitle=位置值('.','NVARCHAR(50)')
从…起
@节点('/Root/People/Person')人(Person)
参加
@节点('/Root/Positions/Positions')位置(Position)
关于person.value(“@id”,“NVARCHAR(50)”)=
position.value('@assignedToPerson[1]','NVARCHAR(50)')
使用按值连接而不是按节点交叉应用应该有效;投影中的positiontitle随后成为元素值(.):
DECLARE@xml='xml'
直率的
乔
工程师
经理
'
挑选
PersonID=person.value('@id',NVARCHAR(50)'),
Name=person.value(‘.’,‘NVARCHAR(50)’),
positionTitle=位置值('.','NVARCHAR(50)')
从…起
@节点('/Root/People/Person')人(Person)
参加
@节点('/Root/Positions/Positions')位置(Position)
关于person.value(“@id”,“NVARCHAR(50)”)=
position.value('@assignedToPerson[1]','NVARCHAR(50)')
有些小改动,但与Jayvee写的内容基本相同。我已经应用了左连接,以确保满足外部应用逻辑
DECLARE @xml xml = '<Root>
<People>
<Person id="1">Frank</Person>
<Person id="2">Joe</Person>
<Person id="3">Joe No Manager</Person>
</People>
<Positions>
<Position assignedToPerson="1">Engineer</Position>
<Position assignedToPerson="2">Manager</Position>
</Positions>
</Root>'
SELECT person.value('@id', 'INT') AS PersonID,
person.value('.', 'NVARCHAR(50)') AS NAME,
position.value('.', 'NVARCHAR(50)') AS positionTitle
FROM @xml.nodes('/Root/People/Person') People(person)
LEFT JOIN @xml.nodes('/Root/Positions/Position') Positions(position)
ON person.value('@id', 'INT') = position.value('@assignedToPerson', 'INT')
DECLARE@xml='xml'
直率的
乔
乔不是经理
工程师
经理
'
选择person.value('@id',INT')作为PersonID,
person.value(‘.’,‘NVARCHAR(50)’)作为名称,
position.value(‘.’,‘NVARCHAR(50)’)作为positionTitle
来自@xml.nodes('/Root/People/Person')的人(Person)
左连接@xml.nodes('/Root/Positions/Positions')位置(Position)
关于person.value('@id',INT')=position.value('@assignedToPerson',INT'))
有些小改动,但与Jayvee写的内容基本相同。我已经应用了左连接,以确保满足外部应用逻辑
DECLARE @xml xml = '<Root>
<People>
<Person id="1">Frank</Person>
<Person id="2">Joe</Person>
<Person id="3">Joe No Manager</Person>
</People>
<Positions>
<Position assignedToPerson="1">Engineer</Position>
<Position assignedToPerson="2">Manager</Position>
</Positions>
</Root>'
SELECT person.value('@id', 'INT') AS PersonID,
person.value('.', 'NVARCHAR(50)') AS NAME,
position.value('.', 'NVARCHAR(50)') AS positionTitle
FROM @xml.nodes('/Root/People/Person') People(person)
LEFT JOIN @xml.nodes('/Root/Positions/Position') Positions(position)
ON person.value('@id', 'INT') = position.value('@assignedToPerson', 'INT')
DECLARE@xml='xml'
直率的
乔
乔不是经理
工程师
经理
'
选择person.value('@id',INT')作为PersonID,
person.value(‘.’,‘NVARCHAR(50)’)作为名称,
position.value(‘.’,‘NVARCHAR(50)’)作为positionTitle
来自@xml.nodes('/Root/People/Person')的人(Person)
左连接@xml.nodes('/Root/Positions/Positions')位置(Position)
关于person.value('@id',INT')=position.value('@assignedToPerson',INT'))
谢谢你的回答,@Jayvee!这看起来不像我希望做的(在nodes()XQUERY中引用前面的nodes()上下文)是可能的。您的答案解决了更大的需求—将两个文档部分连接起来—因此我将授予它答案检查。谢谢您的回答,@Jayvee!这看起来不像我希望做的(在nodes()XQUERY中引用前面的nodes()上下文)是可能的。您的答案解决了更大的需求—连接两个文档部分—因此我将授予它答案检查。