Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在T-SQL nodes()XQuery中引用当前上下文_Xml_Tsql_Xquery Sql - Fatal编程技术网

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()上下文)是可能的。您的答案解决了更大的需求—连接两个文档部分—因此我将授予它答案检查。