我在使用 exist()
时遇到了一些问题和 value()
SQL Server 2008 中的方法。
我的 XML 看起来像这样:
<?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>
鉴于这个 XML,我必须写一个 SELECT
将使用 query()
的子句, value()
和 exist()
每次最少 2 次。我什至不能使用 query()
和 exist()
在同一SELECT
,看起来 WHERE
条款没有任何效力。
例如,我想检索所有 <branch>
类型为 SF
的书的子元素, 但 select 语句
declare @genre varchar(15)
set @genre = 'SF'
SELECT XMLData.query('//branch') from TableA
WHERE XMLData.exist('//book[./@type = sql:variable("@genre")]') = 1
检索所有 <branch>
元素,而不仅仅是目标书中的元素。我无法弄清楚我的选择有什么问题。另外,我会很感激 query()
的一个小例子, exist()
和 value()
在同一个选择中(是否可以在 sql xml 中嵌套选择语句?)
最佳答案
好吧,这里的 XPath 表达式是“罪魁祸首”:
query('//branch')
这是说:选择所有 <branch>
整个文档的节点。它只是按照您的指示去做,真的......
这里的查询有什么问题??
SELECT
XMLData.query('/library/books/book[@type=sql:variable("@genre")]//branch')
FROM dbo.TableA
那将检索所有 <branch>
<book>
的子节点具有 type="SF"
的节点作为一个属性....
你想用你的 query()
达到什么目的? , exist()
和 value()
都在同一个声明中??很可能,它可以做得更容易....
此外:我认为您误解了 .exist()
的内容在 SQL Server XQuery 中。如果您在这里发表声明:
SELECT (some columns)
FROM dbo.TableA
WHERE XMLData.exist('//book[@type = sql:variable("@genre")]') = 1
您基本上是在告诉 SQL Server 从 dbo.TableA
中检索所有行XML 存储在 XMLData
中的位置包含 <book type=.....>
节点 - 您正在从表中选择行 - 不将选择应用到 XMLData
专栏内容...
关于xml - SQL Server XML 存在(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467006/