2017-03-02 43 views
1

我在包含参数的SQL表中有一个字符串列。例如:具有名称和值对的SQL XML查询

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

谁能帮我用SQL查询,例如,从子场,其中OperatorId值是1001在这种情况下返回值,答案是“E23DD735-DCF4- 4878-8810-EAC2594C58A4' 。

回答

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 
+0

辉煌,感谢Shnugo – David