Not sure if this question makes for some poor performance down the track, but seems to at least feel “a better way” right now..
What I am trying to do is this:
I have a table called CONTACTS which amongst other things has a primary key field called memberID
I also have an XML field which contains the ID’s of your friends (for example).. like:
<root><id>2</id><id>6</id><id>14</id></root>
So what I am trying to do via a stored proc is pass in say your member ID, and return all of your friends info, for example:
select name, address, age, dob from contacts
where id... xml join stuff...
The previous way I had it working (well sort of!) selected all the XML nodes (/root/id) into a temp table, and then did a join from that temp table to the contact table to get the contact fields…
Any help much appreciated.. just a bit overloaded from the .query .nodes examples, and of course which is maybe a better way of doing this…
THANKS IN ADVANCE!
<– EDIT –>
I did get something working, but looks like a SQL frankenstein statement!
Basically I needed to get the friends contact ID’s from the XML field, and populate into a temp table like so:
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)
But crikey! the convert/cast thing looks serious.. as I need to get an INT for the next bit which is the actual join to return the contact data as follows:
SELECT memberID, memberName, memberAddress1
FROM members
INNER JOIN @contactIDtable cid
ON members.memberID = cid.ID
ORDER BY memberName
RESULT…
Well it works.. in my case, my memberContacts XML field had 3 nodes (id’s in this case), and the above query returned 3 rows of data (memberID, memberName, memberAddress1)…
The whole point of this of course was to try to save creating a many join table i.e. list of all my friends ID’s… just not sure if the above actually makes this quicker and easier…
Anymore ideas / more efficient ways of trying to do this???
SQL Server’s syntax for reading XML is one of the least intuitive around. Ideally, you’d want to:
Instead, SQL Server requires you to spell out everything. To turn an XML variable or column into a “rowset”, you have to spell out the exact path and think up two aliases:
Now you have to explain to SQL Server how to turn
<id>1</id>into an int:So you can see why most people prefer to decode XML on the client side 🙂
A full example: