【发布时间】:2010-08-01 19:01:42
【问题描述】:
不确定这个问题是否会导致一些糟糕的表现,但现在似乎至少感觉“更好”..
我想要做的是:
我有一个名为 CONTACTS 的表,其中有一个名为 memberID 的主键字段
我还有一个 XML 字段,其中包含您朋友的 ID(例如).. 喜欢:
<root><id>2</id><id>6</id><id>14</id></root>
所以我试图通过存储过程做的是传入你的会员 ID,并返回你所有的朋友信息,例如:
select name, address, age, dob from contacts
where id... xml join stuff...
我之前的工作方式(很好!)将所有 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)
但是可恶!转换/转换的事情看起来很严重..因为我需要为下一位获取一个 INT,这是返回联系人数据的实际连接,如下所示:
SELECT memberID, memberName, memberAddress1
FROM members
INNER JOIN @contactIDtable cid
ON members.memberID = cid.ID
ORDER BY memberName
结果... 很好用.. 在我的例子中,我的 memberContacts XML 字段有 3 个节点(在这种情况下是 id),上面的查询返回了 3 行数据(memberID、memberName、memberAddress1)......
这当然是为了尝试保存创建一个多连接表,即我所有朋友 ID 的列表......只是不确定上面是否真的让这变得更快更容易......
有更多想法/尝试这样做的更有效方法???
【问题讨论】:
-
能否介绍一个匹配联系人的表给好友,这样就不用每次查询都解析xml了?
-
您可以轻松地将
SELECT CONVERT(INT,CAST(T2.memID.query('.') AS varchar(100)))替换为T2.memID.value('(.)[1]', 'INT')并让 SQL Server 为您处理所有转换工作 - 一次且以高效的方式。 -
感谢大家的回复.. 总是很有帮助。有一件事是肯定的,你不会对这些东西感到无聊!非常感谢
标签: sql-server xml sql-server-2008