November 23, 2011 at 12:09 pm
I apologize in advance if you see this posted in two spots. I believe i posted this in a dead thread before.
Ok i have this working however I still don't understand how to get all the values when my select returns more than 1 row. I assume I need a loop just not sure if there is a better way.
Here is what I have:
DECLARE @x XML;
SELECT @x =
r.XMLData
FROM RulesetGroups rg
INNER JOIN Rulesets rs on
rg.RulesetGroupID = rs.RulesetGroupID
INNER JOIN Rules r on
rs.RulesetID = r.RulesetID
WHERE r.RuleTypeID = 3 and r.XMLData.value('(/Screen/ScreenOption/@Name)[1]', 'varchar(255)') is not null;
-- select "Name"
WITH Num(i)
AS
(
SELECT 1
UNION ALL
SELECT i + 1
FROM Num
WHERE i < (SELECT @x.value('count(/Screen/ScreenOption/@Name)','varchar(255)') )
)
SELECT x.value('@Name[1]', 'varchar(20)')
FROM Num
CROSS APPLY @x.nodes('/Screen/ScreenOption[position()=sql:column("i")]') e(x);
My XML for one row. I will have hundreds of these though in different rows:
<Screen Title="">
<ScreenOption Sequence="1" Name="BTWidth" />
<ScreenOption Sequence="2" Name="BTHeight" />
</Screen>
Someone responded with this however I don't understand it. Is this meant to replace everything from above? If so i get an error even with xmldata.nodes portion saying you can't alias it.
SELECT t.u.value('@Sequence','int') as Sequence,
t.u.value('@Name','varchar(100)') as Name
FROM RulesetGroups rg
INNER JOIN Rulesets rs on
rg.RulesetGroupID = rs.RulesetGroupID
INNER JOIN Rules r on
rs.RulesetID = r.RulesetID
CROSS APPLY XMLData.Nodes('/Screen/ScreenOption')t(u)
WHERE r.RuleTypeID = 3 and t.u.value('@Name', 'varchar(255)') is not null
ORDER BY t.u.value('@Sequence','int')
Any help will be much appreciated.
November 23, 2011 at 12:40 pm
XML is case-sensitive. That appears to include the .nodes() function.
Drew
J. Drew Allen
Business Intelligence Analyst
Philadelphia, PA
November 23, 2011 at 12:49 pm
wow that is awesome.
Thank you so much.
November 23, 2011 at 8:18 pm
drew.allen (11/23/2011)
XML is case-sensitive. That appears to include the .nodes() function.Drew
The first time I found that out, my thought was "Great... first, mandatory semi-colons and now mandatory casing. It's getting to be more like Oracle every day."
--Jeff Moden
Change is inevitable... Change for the better is not.
Viewing 4 posts - 1 through 4 (of 4 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy