SQL 2008:获取带有连接的行到XML字段?

Dav*_*.id 2 xml sql-server sql-server-2008

不确定这个问题是否会导致一些糟糕的表现,但现在似乎至少感觉"更好的方式".

我想要做的是这样的:

我有一个名为CONTACTS的表,其中包含一个名为memberID的主键字段

我还有一个XML字段,其中包含您朋友的ID(例如)..喜欢:

  <root><id>2</id><id>6</id><id>14</id></root>
Run Code Online (Sandbox Code Playgroud)

所以我通过存储过程尝试做的是传递你的会员ID,并返回你所有的朋友信息,例如:

  select name, address, age, dob from contacts
  where id... xml join stuff...
Run Code Online (Sandbox Code Playgroud)

我之前使用它的方式(好吧!)将所有XML节点(/ root/id)选中到临时表中,然后从该临时表到联系表进行连接以获取联系人字段...

任何帮助都非常感谢..从.query .nodes示例中略微超载,当然这可能是更好的方法...

提前致谢!

< - 编辑 - >我确实得到了一些工作,但看起来像一个SQL frankenstein声明!基本上我需要从XML字段中获取朋友联系人ID,并填充到临时表中,如下所示:

Declare @contactIDtable TABLE (ID int)
INSERT INTO @contactIDtable (ID)
        SELECT CONVERT(INT,CAST(T2.memID.query('.') AS varchar(100))) AS friendsID
        FROM dbo.members
        CROSS APPLY memberContacts.nodes('/root/id/text()') AS T2(memID)
Run Code Online (Sandbox Code Playgroud)

但是老实说!转换/转换的东西看起来很严重..因为我需要获得下一位的INT,这是实际的连接以返回联系人数据,如下所示:

SELECT memberID, memberName, memberAddress1
    FROM members
    INNER JOIN @contactIDtable cid
    ON members.memberID = cid.ID
    ORDER BY memberName
Run Code Online (Sandbox Code Playgroud)

结果......好吧它工作..在我的情况下,我的memberContacts XML字段有3个节点(在这种情况下为id),上面的查询返回3行数据(memberID,memberName,memberAddress1)...

当然这一点的重点是尝试保存创建一个很多连接表,即所有朋友ID的列表...只是不确定上面是否实际上使这更快更容易...

尝试这样做的想法/更有效的方法???

And*_*mar 13

SQL Server的读取XML语法是最不直观的语法之一.理想情况下,您需要:

select   f.name
from     friends f
join     @xml x
on       x.id = f.id
Run Code Online (Sandbox Code Playgroud)

相反,SQL Server要求您拼出所有内容.要将XML变量或列转换为"行集",您必须拼出确切的路径并想出两个别名:

@xml.nodes('/root/id') as table_alias(column_alias)
Run Code Online (Sandbox Code Playgroud)

现在你必须向SQL Server解释如何<id>1</id>变成int:

table_alias.column_alias.value('.', 'int')
Run Code Online (Sandbox Code Playgroud)

所以你可以看到为什么大多数人更喜欢在客户端解码XML :)

一个完整的例子:

declare @friends table (id int, name varchar(50))
insert @friends (id, name)
          select  2, 'Locke Lamorra'
union all select  6, 'Calo Sanzo'
union all select 10, 'Galdo Sanzo'
union all select 14, 'Jean Tannen'

declare @xml xml
set @xml = ' <root><id>2</id><id>6</id><id>14</id></root>'

select  f.name
from    @xml.nodes('/root/id') as table_alias(column_alias)
join    @friends f
on      table_alias.column_alias.value('.', 'int') = f.id
Run Code Online (Sandbox Code Playgroud)