Je voudrais avoir une table dans laquelle je peux stocker des expressions de comparaison XQuery , afin que je puisse les évaluer dans une requête.
Je fais un peu de R & D dans si c'est possible, et je me bats.
Si je mets une expression XQuery dans une colonne, alors il semble évaluer différemment si je mets l'expression XQuery directement dans la requête. Par exemple, lorsque j'exécute la requête ci-dessous:
declare @x xml = '' create table #condition ( condition nvarchar(255) ) insert into #condition values ('''1''=''1''') select condition, @x.query('sql:column("condition")'), @x.query('''1''=''1''') from #condition
Je m'attendrais à ce que cela revienne:
'1'='1', true, true
Cependant, il revient réellement:
'1'='1', '1'='1', true
Est-ce que quelqu'un sait comment je peux évaluer les expressions de comparaison qui sont stockées dans une colonne?
Le plan éventuel est de pouvoir utiliser cette technique pour filterr les lignes d'une table en fonction des conditions XQuery présentes. Donc, finalement, je voudrais être en mesure de le faire dans la clause where d'une déclaration select.
J'ai mis l'exemple ci-dessus dans un encrier sql sql, il est utile.
Merci beaucoup
Réponse courte: Malheureusement vous ne pouvez pas.
sql:column("condition")
sera évalué à un type de données primitif XML approprié en fonction du type de colonne de la table. Dans ce cas, la valeur de la colonne de condition
sera toujours évaluée en tant que type de ssortingng
XML au lieu d'une instruction XQuery, comme vous l'avez compris en exécutant votre exemple de requête. Et je ne vois pas comment évaluer l'instruction XQuery dynamic, sauf si vous voulez build dynamicment la requête entière et l'exécuter ultérieurement en utilisant éventuellement sp_executesql
.
Essayez cette requête:
déclare @x xml = ''
create table #condition (condition nvarchar (255))
insert dans #condition values ('' '1' '=' '1' '') select condition, cas quand col1 comme col2 puis 'True' sinon 'False' END col, quer from
(select la condition, PARSENAME (REPLACE (condition, '=', '.'), 2) col1, PARSENAME (REPLACE (condition, '=', '.'), 1) col2, @ x.query ('' ' 1 '' = '' 1 '' ') à partir de #condition) base