2013-01-23 2 views
0

J'ai une table dans une base de données SQL Server 2008 avec une colonne nvarchar (MAX) contenant des données XML. Les données représentent des critères de recherche. Voici à quoi ressemble le XML pour les critères de recherche avec un groupe "OU" de niveau supérieur contenant un seul critère et un groupe "AND" imbriqué à deux critères.Aide sur les requêtes SQL XML

<?xml version="1.0" encoding="utf-16"?> 
<SearchCriterionGroupArgs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SingleCriteria> 
    <SearchCriterionSingleArgs> 
     <Operator>Equals</Operator> 
     <Value>test</Value> 
     <FieldIDs> 
     <int>1026</int> 
     <int>478</int> 
     </FieldIDs> 
     <EntityID>92</EntityID> 
    </SearchCriterionSingleArgs> 
    </SingleCriteria> 
    <GroupCriteria> 
    <SearchCriterionGroupArgs> 
     <SingleCriteria> 
     <SearchCriterionSingleArgs> 
      <Operator>GreaterThan</Operator> 
      <Value>2010-01-23</Value> 
      <FieldIDs> 
      <int>1017</int> 
      </FieldIDs> 
      <EntityID>92</EntityID> 
     </SearchCriterionSingleArgs> 
     <SearchCriterionSingleArgs> 
      <Operator>LessThan</Operator> 
      <Value>2013-01-23</Value> 
      <FieldIDs> 
      <int>1018</int> 
      </FieldIDs> 
      <EntityID>92</EntityID> 
     </SearchCriterionSingleArgs> 
     </SingleCriteria> 
     <GroupCriteria /> 
     <EntityID>92</EntityID> 
     <LogicalOperator>AND</LogicalOperator> 
    </SearchCriterionGroupArgs> 
    </GroupCriteria> 
    <EntityID>92</EntityID> 
    <LogicalOperator>OR</LogicalOperator> 
</SearchCriterionGroupArgs> 

Compte tenu de l'entrée ensemble de valeurs FieldID, je dois chercher la table pour trouver s'il y a des enregistrements dont les critères de recherche se référer à l'une de ces valeurs (celles-ci sont représentées dans les noeuds « int » sous la "noeuds de FieldIDs")

En exécutant cette requête.

select CAST(OptionalConditions as xml).query('//FieldIDs') 
from tblMyTable 

je reçois les résultats:

<FieldIDs> 
    <int>1026</int> 
    <int>478</int> 
</FieldIDs> 
<FieldIDs> 
    <int>1017</int> 
</FieldIDs> 
<FieldIDs> 
    <int>1018</int> 
</FieldIDs> 

(actuellement, il n'y a qu'un seul enregistrement dans la table avec des données XML.)

Mais je ne fais que commencer avec ce genre de choses et je ne sais pas quelle serait la notation pour vérifier l'existence de ces listes de l'un quelconque d'un ensemble arbitraire de FieldID. Je n'ai pas besoin de récupérer des nœuds particuliers, juste vrai ou faux pour savoir si les ID des champs d'entrée sont référencés n'importe où dans la recherche.

Merci pour votre aide!

Edit: en utilisant la solution de Ranon, je l'ai eu de travail en utilisant une requête comme ceci:

SELECT * 
FROM myTable 
WHERE CAST(OptionalConditions as xml).exist('//FieldIDs/int[.=(1019,111,1018)]') = 1 

Répondre

1

tous Fetch FieldIDs et les comparer avec les ID id ensemble pour vérifier contre. L'opérateur = de XQuery se compare à une sémantique basée sur un ensemble, donc si l'un des ID du côté gauche est égal à l'un à droite, cette expression sera évaluée à true.

//FieldIDs/int = (42, 478) 

Comme "478" est un FieldID, cette requête renvoie true. "42" est un non disponible. Je ne suis pas sûr de savoir si vous serez capable de distribuer le résultat à un certain type sql-server-boolean car je n'en ai pas encore un en cours d'exécution, mais vous pourrez facilement essayer vous-même.


Si vous êtes également intéressé par les noeuds contenus, vous pouvez utiliser cette requête:

//FieldIDs/int[. = (42,478)] 
+0

parfait, qui l'a fait. Merci! –