Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server XML esiste()

Bene, la tua espressione XPath qui è il "colpevole":

query('//branch')

Questo dice:seleziona tutti <branch> nodi dell'intero documento. Sta solo facendo quello che gli stai dicendo di fare, davvero...

Cosa c'è di sbagliato in questa query qui??

SELECT 
    XMLData.query('/library/books/book[@type=sql:variable("@genre")]//branch')
FROM dbo.TableA

Ciò recupererebbe tutto il <branch> sottonodi per il <book> nodo che ha type="SF" come attributo....

Cosa stai cercando di ottenere con la tua query() , exist() e value() tutti nella stessa affermazione?? Molto probabilmente, può essere fatto molto più facilmente....

Inoltre:penso che tu stia interpretando erroneamente cosa .exist() in SQL Server XQuery lo fa. Se hai la tua dichiarazione qui:

 SELECT (some columns)
 FROM dbo.TableA
 WHERE XMLData.exist('//book[@type = sql:variable("@genre")]') = 1

in pratica stai dicendo a SQL Server di recuperare tutte le righe da dbo.TableA dove l'XML è memorizzato in XMLData contiene un <book type=.....> nodo - stai selezionando le righe dalla tabella - NON applicando una selezione a XMLData contenuto della colonna...