Tengo algunos problemas usando los métodos exist()
y value()
en SQL Server 2008.SQL existir servidor XML()
Mi XML tiene el siguiente aspecto:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<branches>
<branch>
<codelib>1</codelib>
<name>Campus</name>
</branch>
<branch>
<codelib>2</codelib>
<name>47th</name>
</branch>
<branch>
<codelib>3</codelib>
<name>Mall</name>
</branch>
</branches>
<books>
<book type="SF">
<codb>11</codb>
<title>Robots</title>
<authors>
<author>author1 robots</author>
<author>author2 robots</author>
</authors>
<price>10</price>
<stocks>
<branch codelib="1" amount="10"/>
<branch codelib="2" amount="5"/>
<branch codelib="4" amount="15"/>
</stocks>
<from>20</from>
<to>30</to>
</book>
<book type="poetry">
<codb>12</codb>
<title>Poetry book</title>
<authors>
<author>AuthorPoetry</author>
</authors>
<price>14</price>
<stocks>
<branch codelib="1" amount="7"/>
<branch codelib="2" amount="5"/>
</stocks>
<from>25</from>
<to>40</to>
</book>
<book type="children">
<codb>19</codb>
<title>Faitytales</title>
<authors>
<author>AuthorChildren</author>
</authors>
<price>20</price>
<stocks>
<branch codelib="1" amount="10"/>
<branch codelib="3" amount="55"/>
<branch codelib="4" amount="15"/>
</stocks>
<from>70</from>
<to>75</to>
</book>
<book type="literature">
<codb>19</codb>
<title>T</title>
<authors>
<author>A</author>
</authors>
<price>17</price>
<stocks>
<branch codelib="1" amount="40"/>
</stocks>
<from>85</from>
<to>110</to>
</book>
</books>
</library>
Teniendo en cuenta este XML, tengo que escribir una SELECT
cláusula que utilizará query()
, value()
y exist()
2 veces cada uno, como mínimo. Ni siquiera puedo usar query()
y exist()
en el mismo SELECT
, ya que parece que la cláusula WHERE
no tiene ningún efecto en absoluto.
Por ejemplo, quiero recuperar todos los <branch>
elementos que son los niños del libro con el tipo SF
, pero la instrucción de selección
declare @genre varchar(15)
set @genre = 'SF'
SELECT XMLData.query('//branch') from TableA
WHERE XMLData.exist('//book[./@type = sql:variable("@genre")]') = 1
recupera todos los <branch>
elementos, no sólo las del objetivo libro. No puedo entender qué pasa con mi selección. Asimismo, le agradecería un pequeño ejemplo con query()
, exist()
y value()
en la misma selección (es posible tener anidado instrucciones select en SQL XML?)
No es lo que quiero, pero tengo que usar tanto query(), value() y existir() en la misma instrucción. Es por eso que quiero hacer algún tipo de filtrado como en T-SQL, SELECCIONAR ... DONDE ... puede algo así como declaraciones SELECT anidadas, si eso es posible. Solo quiero un ejemplo sobre cómo lograr algo así – joanna