Поиск XML SQL без имени поля ID

Я пытаюсь сделать простой поиск SQL XML, но из-за того, как данные случайным образом хранятся в XML, у меня есть трудное время, выясняя, как искать XML для отображения параметров поиска.

У меня есть поле ParameterStr, которое содержит данные XML, как показано ниже.
Мне нужно отобразить значение узла.

Ниже приведен мой код, но все, что я получаю, когда я пытаюсь искать, это ноль. Меняется для записи заказа, поэтому я не могу ключ выключения этого узла.

Любая помощь была бы великолепна.
КОД:

GO
DECLARE @SearchForT1 NVARCHAR(100)
set @SearchForT1 = 'T_Minus1';

select ParameterStr.exist ('/Parameters/Parameter[VariableName=sql:variable("@SearchForT1")]/valueasstring[0]') from tbl_TextXMLData 

XML в поле: ParameterStr

<Parameters>
   <Parameter>
     <VariableID>(10203,14505)</VariableID>
     <VariableName>RushFee</VariableName>
     <ValueAsString>0</ValueAsString>
   </Parameter>
   <Parameter>
     <ID>(132979,14030)</ID>
     <VariableID>(10314,14505)</VariableID>
     <VariableName>T_Minus3</VariableName>
     <ValueAsString>01/13/2017 4:00PM</ValueAsString>
     <ValueAsDateTime>01/13/2017 4:00PM</ValueAsDateTime>
   </Parameter>
   <Parameter>
     <ID>(132978,14030)</ID>
     <VariableID>(10313,14505)</VariableID>
     <VariableName>T_Minus2</VariableName>
     <ValueAsString>01/16/2017 4:00PM</ValueAsString>
   </Parameter>
   <Parameter>
     <ID>(132977,14030)</ID>
     <VariableID>(10312,14505)</VariableID>
     <VariableName>T_Minus1</VariableName>
     <ValueAsString>01/17/2017 4:00PM</ValueAsString>
   </Parameter>
 </Parameters>

2 ответа

  1. Хотя я не уверен, соответствует ли оператор xpath вашему требованию, но, по крайней мере, он возвращаетсяtrue, если вы измените последний шаг на /ValueAsString:

    DECLARE @x xml  
    SET @x = '<Parameters>
       <Parameter>
         <VariableID>(10203,14505)</VariableID>
         <VariableName>RushFee</VariableName>
         <ValueAsString>0</ValueAsString>
       </Parameter>
       <Parameter>
         <ID>(132979,14030)</ID>
         <VariableID>(10314,14505)</VariableID>
         <VariableName>T_Minus3</VariableName>
         <ValueAsString>01/13/2017 4:00PM</ValueAsString>
         <ValueAsDateTime>01/13/2017 4:00PM</ValueAsDateTime>
       </Parameter>
       <Parameter>
         <ID>(132978,14030)</ID>
         <VariableID>(10313,14505)</VariableID>
         <VariableName>T_Minus2</VariableName>
         <ValueAsString>01/16/2017 4:00PM</ValueAsString>
       </Parameter>
       <Parameter>
         <ID>(132977,14030)</ID>
         <VariableID>(10312,14505)</VariableID>
         <VariableName>T_Minus1</VariableName>
         <ValueAsString>01/17/2017 4:00PM</ValueAsString>
       </Parameter>
     </Parameters>';
    
    DECLARE @SearchForT1 NVARCHAR(100)
    set @SearchForT1 = 'T_Minus1';
    
    SELECT @x.exist('/Parameters/Parameter[VariableName=sql:variable("@SearchForT1")]/ValueAsString');
    

    Выход:

    (No column name)
    ----------------
    True
    

    Надеюсь, это поможет.

  2. Я нашел ответ:

    ParameterStr.query('/Parameters/Parameter[VariableName=sql:variable("@SearchForT1")]/ValueAsString/text()[1]')