具有名称和值对的SQL XML查询

时间:2017-03-02 09:42:30

标签: sql xml tsql

我在SQL表中有一个包含Parameters的字符串列。例如:

<ParameterValues>
    <ParameterValue>
        <Name>Sub</Name>
        <Value>E23DD735-DCF4-4878-8810-EAC2594C58A4</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>OperatorId</Name>
        <Value>1001</Value>
    </ParameterValue>
</ParameterValues> 

任何人都可以帮助我使用SQL查询,例如,从Operator字段中返回值,其中OperatorId值为1001.在这种情况下,答案是“E23DD735-DCF4-4878-8810-” EAC2594C58A4&#39;

1 个答案:

答案 0 :(得分:2)

用它来测试它:

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>');

直接调用以获得您正在寻找的一个值:

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

返回

E23DD735-DCF4-4878-8810-EAC2594C58A4

尝试这样来获取派生表:

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)

结果

ID  Parameter_Name  Parameter_Value
1   Sub             E23DD735-DCF4-4878-8810-EAC2594C58A4
1   OperatorId      1001