xml - SQL Server XML 存在()

标签 xml sql-server-2008

我在使用 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/

相关文章:

c# - XPath 表达式求值错误

java - jackson XML 注释 : String element with attribute

java - 如何将用户定义的表类型传递给来自 Java 的 MSSQL 请求

sql-server - SQL 服务器变量 : loop vs duplicate?

sql - 我的 CASE 语句是错误的。知道我做错了什么吗?

xml - 在 Freemarker 中使用 NetSuite 日期

android - 获取标准布局属性

xml 模式并使用选择作为文档根

sql - 数据透视表字符串在数据透视列下分组?

sql-server-2008 - 选择尚未在记录集中的所有记录