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)
| 归档时间: |
|
| 查看次数: |
13204 次 |
| 最近记录: |