我在SQL Server 2008中使用exist()value()方法时遇到一些问题。

我的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次。 我甚至exist()在同一个SELECT使用query()exist() ,因为看起来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>元素,而不仅仅是目标书籍中的元素。 我无法弄清楚我的选择有什么问题。 另外,我会很感激在同一个select中使用query()exist()value()一个小例子(是否可以在sql xml中使用嵌套的select语句?)

===============>>#1 票数:7

那么,你的XPath表达式就是“罪魁祸首”:

query('//branch')

这表示:从整个文档中选择所有 <branch>节点。 它正在做你要告诉它的事情,真的......

这个查询有什么问题?

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

这将检索具有type="SF"作为属性的<book>节点的所有<branch>子节点....

你想用同一个语句中的query()exist()value()来实现什么? 很可能,它可以做得更轻松....

另外:我认为你误解了SQL Server XQuery中的.exist() 如果您在此声明:

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

你基本上是告诉SQL Server来检索所有行dbo.TableA其中存储在XML XMLData包含<book type=.....>节点-你从表中选择数据- 适用选择到XMLData专栏内容......

===============>>#2 票数:3

您提供的XML不适用于exist语句。 如果您有多个XML语句并且需要找到包含某些值的语句,那么该语句将更具相关性。

您提供的where子句只检查条件是否存在,如果存在,则选择所有branches元素,而不仅仅是条件为true的元素。 例如,以下(显然)不返回任何内容:

SELECT @xmldata.query('//branch') from TableA
 WHERE @xmldata.exist('//book[./@type = "BLAH"]') = 1

但是这里有一些东西可以证明你可以在一个select语句中使用所有三个。

SELECT T.c.query('./title').value('.', 'varchar(250)') as title, 
       T.c.exist('.[@type eq "SF"]') as IsSF
  from @xmldata.nodes('//book') T(c)

===============>>#3 票数:0

使用交叉应用运算符过滤到所需节点,然后从返回的节点中选择查询,使用XML进行过滤会更有效。 要查询子节点,还需要包含根节点。 在查询中所以在这种情况下.//branch而不是// branch。

declare @genre varchar(15) = 'SF'
select l.query('.//branch') from TableA
cross apply XmlData.nodes('library/books/book[@type=sql:variable("@genre")]') n (l)

如果需要,您仍然可以添加exists子句,但这实际上会增加额外的不必要开销

WHERE XMLData.exist('//book[./@type = sql:variable("@genre")]') = 1

希望这可以帮助。 d

  ask by joanna translate from so

未解决问题?本站智能推荐:

3回复

SQL Server 2008 XML数据类型是否存在性能问题

嗨,我需要将数百个(如果不是数千个)元素存储为XML。 我不会在XML字段中建立任何索引。 我将只选择xml中的某些元素。 我想知道仅选择XML中的字段是否会对性能造成任何影响。 这是将存储在数据库中的示例XML。 一条记录中可能会包含3000多个字段标签。 我只想在一个查询中
1回复

SQL Server:验证XML

我正在使用SQL Server 2005和2008,并且试图将各种不同的XML文件导入到我的数据库中,有时XML无效。 每个XML文件都与上一个不同。 有什么方法可以创建一个根据XML是否有效返回0或1的函数?
4回复

SQL Server中的XML输出

我希望表输出为XML。 我的表结果是 我需要像这样的结果 询问 谢谢, 桑达尔
1回复

将XML插入SQL Server 2008

我在将XML插入SQL Server 2008时遇到了麻烦。我的Java应用程序创建了XML,然后尝试将其插入SQL Server 2008下的“ XML”类型的列中。 抛出错误 这是XML声明 我不确定SQL Server 2008应该使用哪种XML编码。 谁能建议
1回复

使用SQL Server解析XML

在nvarchar字段Description我具有以下数据: 我想查询这个“ xml”并得到以下结果: 因此,我编写以下查询: 但是我所有的结果都是NULL 。 看来我在XML选择器中做错了什么...我在做什么错?
2回复

Sql Server Xml到表逻辑

我需要查询具有多个REPORT标记元素的Xml数据。 需要对其进行过滤以仅返回REPORTID等于给定名称的行。 我试过这个过滤器没有运气。 有人可以使用Sql Server Xml函数指出我在正确的方向吗? 基本上,我正在寻找我的结果集作为一个表返回,看起来像: 鉴于以下内
1回复

SQL Server XML解析

请在下面的脚本片段中找到 我正在获取所有的“ id”节点值,即“ 1”和“ 2”。 我的需要,在这种情况下,我必须直接获取第二个'id'的值。它将是'2'。 谁能让我知道相同的Select查询语法? 谢谢。
3回复

自定义xml和sql server

我从sql server 2008创建了xml。我的当前xml是使用“FOR XML AUTO”生成的 但我希望输出像 所以基本上我想将父元素的属性转换为子元素。 并希望有其他自定义元素。 请帮我。 提前致谢。
2回复

SQL Server输出为XML

生成输出为XML的SQL Server代码我对此有问题,无法按要求获取输出 select Section.Text, Section.ImageUrl, (select Item.Text "Item/@Text", Item.
1回复

更新XML列-SQL Server

我有一个XML栏 设置 实际上,我需要更新以上的上一列,以将以下子分支插入Tag3分支中,仅当它们不在该列中且Tag1为true时 我可以选择Tag1为true的地方,但与Tag3子分支(仅在Tag3中不存在它们的情况下)更新Tag3分支时有些困惑。 SELECT * f