Reputation: 273
I have a string column in a SQL table that contains Parameters. For example:
<ParameterValues>
<ParameterValue>
<Name>Sub</Name>
<Value>E23DD735-DCF4-4878-8810-EAC2594C58A4</Value>
</ParameterValue>
<ParameterValue>
<Name>OperatorId</Name>
<Value>1001</Value>
</ParameterValue>
</ParameterValues>
Can anyone help me with a SQL Query to, for example, return the value from the Sub field where the OperatorId value is 1001. In this case, the answer would be 'E23DD735-DCF4-4878-8810-EAC2594C58A4'.
Upvotes: 1
Views: 1114
Reputation: 67321
Use this to test it:
DECLARE @tbl TABLE (ID INT IDENTITY,YourXmlAsString NVARCHAR(MAX));
INSERT INTO @tbl VALUES
('<ParameterValues>
<ParameterValue>
<Name>Sub</Name>
<Value>E23DD735-DCF4-4878-8810-EAC2594C58A4</Value>
</ParameterValue>
<ParameterValue>
<Name>OperatorId</Name>
<Value>1001</Value>
</ParameterValue>
</ParameterValues>');
A direct call to get exactly the one value your are looking for:
WITH Casted AS (SELECT ID,CAST(YourXmlAsString AS XML) AS TheXml FROM @tbl AS t)
SELECT TheXml.value(N'(/ParameterValues/ParameterValue[Name="Sub"]/Value)[1]','uniqueidentifier') AS TheID
FROM Casted
WHERE TheXml.exist(N'/ParameterValues/ParameterValue[Name="OperatorId"]/Value[text()="1001"]')=1
returns
E23DD735-DCF4-4878-8810-EAC2594C58A4
Try it like this to get a derived table:
WITH Casted AS (SELECT ID,CAST(YourXmlAsString AS XML) AS TheXml FROM @tbl AS t)
SELECT ID
,pv.value(N'(Name/text())[1]',N'nvarchar(max)') AS Parameter_Name
,pv.value(N'(Value/text())[1]',N'nvarchar(max)') AS Parameter_Value
FROM Casted
CROSS APPLY Casted.TheXml.nodes(N'/ParameterValues/ParameterValue') AS A(pv)
The result
ID Parameter_Name Parameter_Value
1 Sub E23DD735-DCF4-4878-8810-EAC2594C58A4
1 OperatorId 1001
Upvotes: 2