标签: xquery-sql

如何使用Sql获取XML属性的值:xquery中的变量

我想使用Xquery从XML获取属性值.

我的XML是

<Answers>
  <AnswerSet>
    <Answer questionId="NodeID">155</Answer>
    <Answer questionId="ParentNode" selectedValue="12">Product</Answer>
  </AnswerSet>
</Answers>
Run Code Online (Sandbox Code Playgroud)

以下是我的查询.

DECLARE @Field Varchar(100)
DECLARE @Attribute VARCHAR(100)
SET @Field='ParentNode'
SET @Attribute = 'selectedValue'

SELECT ISNULL(PropertyXML.value('(/Answers/AnswerSet/Answer[@questionId=sql:variable("@Field")])[1]','varchar(max)'),'') ,
Run Code Online (Sandbox Code Playgroud)

ISNULL(PropertyXML.value('(/ Answers/AnswerSet/Answer [@ questionId = sql:variable("@ Field")]/sql:variable(@Attribute))[1]','varchar(max)'), '')FROM节点WHERE id = 155

下面的行与sql:variable一起工作正常

ISNULL(PropertyXML.value('(/Answers/AnswerSet/Answer[@questionId=sql:variable("@Field")])[1]','varchar(max)'),'')
Run Code Online (Sandbox Code Playgroud)

但我在下面的行中得到错误..

ISNULL(PropertyXML.value('(/Answers/AnswerSet/Answer[@questionId=sql:variable("@Field")]/sql:variable(@Attribute) )[1]','varchar(max)'),'')
Run Code Online (Sandbox Code Playgroud)

我想在结果中获得提供的属性(@Attribute)值.

sql t-sql sql-server xquery-sql

6
推荐指数
1
解决办法
3087
查看次数

在SQL Server 2005中查询XML时,文档的多个标记位于同一行

更新以提供说明

这是我遇到问题的一个xml文件的完整副本.

<Grower_Run xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Puller xsi:type="Puller">
    <Puller_Number xsi:type="xsd:int">16</Puller_Number>
  </Puller>
  <Run_ID xsi:type="xsd:string">SA1611030B</Run_ID>
  <Crucible xsi:type="Crucible">
    <Crucible_Type xsi:type="xsd:string">RWNTYPE</Crucible_Type>
    <Section>
      <Grower_Run_Section>
        <SectionID xsi:type="xsd:string">SA1611030B1</SectionID>
        <Crystal_Growth>
          <Growth_StartTime xsi:type="xsd:dateTime">2011-03-01T12:59:30</Growth_StartTime>
          <Growth_Process>
            <Growth_Process>
              <Process_Name xsi:type="xsd:string">BODY</Process_Name>
              <Single_Moment_Snapshot>
                <Single_Moment_Snapshot>
                  <Snapshot_Name xsi:type="xsd:string">Body Start</Snapshot_Name>
                  <Snapshot_Datetime xsi:type="xsd:dateTime">2011-03-01T17:11:30</Snapshot_Datetime>
                  <Ingot_Length xsi:type="xsd:decimal">228.19</Ingot_Length>
                  <Heater_Temp xsi:type="xsd:decimal">1337.09</Heater_Temp>
                  <LS_Temp xsi:type="xsd:decimal">1243.00</LS_Temp>
                  <Heater_Power xsi:type="xsd:decimal">56.10</Heater_Power>
                </Single_Moment_Snapshot>
                <Single_Moment_Snapshot>
                  <Snapshot_Name xsi:type="xsd:string">Mid Body</Snapshot_Name>
                  <Snapshot_Datetime xsi:type="xsd:dateTime">2011-03-01T17:11:30</Snapshot_Datetime>
                  <Ingot_Length xsi:type="xsd:decimal">228.19</Ingot_Length>
                  <Heater_Temp xsi:type="xsd:decimal">1337.09</Heater_Temp>
                  <LS_Temp xsi:type="xsd:decimal">1243.00</LS_Temp>
                  <Heater_Power xsi:type="xsd:decimal">56.10</Heater_Power>
                </Single_Moment_Snapshot>
                <Single_Moment_Snapshot>
                  <Snapshot_Name xsi:type="xsd:string">Tail Start</Snapshot_Name>
                  <Snapshot_Datetime xsi:type="xsd:dateTime">2011-03-02T01:34:24</Snapshot_Datetime>
                  <Ingot_Length xsi:type="xsd:decimal">230.40</Ingot_Length>
                  <Heater_Temp xsi:type="xsd:decimal">1338.20</Heater_Temp>
                  <LS_Temp xsi:type="xsd:decimal">1243.40</LS_Temp>
                  <Heater_Power xsi:type="xsd:decimal">56.39</Heater_Power>
                </Single_Moment_Snapshot>
              </Single_Moment_Snapshot>
            </Growth_Process>
          </Growth_Process>
          <Growth_FinishTime xsi:type="xsd:dateTime">2011-03-02T01:35:24</Growth_FinishTime>
        </Crystal_Growth>
      </Grower_Run_Section> …
Run Code Online (Sandbox Code Playgroud)

xml sql-server sql-server-2005 xquery-sql

5
推荐指数
1
解决办法
1679
查看次数

如何替换SQL Server 2005中的XML节点的一部分

我想知道如何使用xquery更新SQL Server 2005中XML节点的部分文本

在以下示例中,我想将"very"替换为"excellent"

    declare @xml as xml
    set @xml = '<root><info>well hello this is a very good example</info></root>'
    declare @replacement as varchar(50)
    set @replacement = 'excellent'
    declare @search as varchar(50)
    set @search = 'very'

    set @xml.modify('replace value of (/root/info/text())[1]
                     with replace((/root/info/text())[1],sql:variable("@search"),sql:variable("@replacement"))'
        )
    select @xml
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激

replace sql-server-2005 xquery-sql

5
推荐指数
1
解决办法
3566
查看次数

使用XQuery对SQL查询中的XML的所有属性进行排序

如何在SQL中使用XQuery获取带有排序属性的XML?

例如,这个XML:

<root><book b='' c='' a=''/></root>
Run Code Online (Sandbox Code Playgroud)

必须返回:

<root><book a='' b='' c=''/></root>
Run Code Online (Sandbox Code Playgroud)

xml sql xquery-sql

5
推荐指数
1
解决办法
875
查看次数

如何在CAST/CONVERT之前检查VARCHAR(n)格式良好的XML

我的公司有一个记录表,其中包含一个VARCHAR(N)列,其中放置了一个应该是XML 的字符串,但事实证明它并不总是格式良好.为了对日志记录进行分析(以识别错误趋势等),我一直在使用LIKE语句.然而,这非常缓慢.

最近,我发现SQL Server支持XQuery,所以我开始玩它.我遇到的问题是我无法找到一种方法来处理CAST/CONVERT我的SELECT声明中的错误.我最接近的是需要SQL Server 2012,因为它具有该TRY_CONVERT功能,但是从2008 R2升级现在不是一个选项.

这就是我所拥有的(如果我的公司在2012年运行,这将有效):

CREATE FUNCTION IsMatch(
    @message AS VARCHAR(MAX),
    @match AS VARCHAR(MAX),
    @default AS VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @xml XML = TRY_CONVERT(XML, @message)
    DECLARE @result VARCHAR(MAX) =
        CASE WHEN @xml IS NOT NULL
             THEN CASE WHEN @xml.exist('(/FormattedMessage)[contains(.,sql:variable("@match"))]') = 1
                       THEN @match 
                       ELSE @default 
                       END
             ELSE CASE WHEN @message LIKE '%' + @match + '%'
                       THEN @match
                       ELSE @default
                       END
             END
    RETURN …
Run Code Online (Sandbox Code Playgroud)

t-sql validation casting xquery-sql

5
推荐指数
1
解决办法
5105
查看次数

指定default时,SQL Server会创建XML命名空间

举个简单的例子:

declare @myXml xml
set @myXML = '
<root>
    <line id="1"/>
    <line id="2"/>
    <line id="3"/>
</root>'
select t.c.query('.')
from @myXml.nodes('/root/line') t(c)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,我回到了三行,看起来像这样:

<line id="1" />
Run Code Online (Sandbox Code Playgroud)

但是,当XML声明其命名空间(甚至只是默认的xmlns)时,您还需要在SQL中指定该命名空间,否则结果集将为空.我知道两种方法:nodes()方法调用中的声明语句或带有xmlnamespaces语句的声明语句.让我们用后者:

declare @myXml xml
set @myXML = '
<root xmlns="urn:somename">
    <line id="1"/>
    <line id="2"/>
    <line id="3"/>
</root>';

with xmlnamespaces(default 'urn:somename')
select t.c.query('.')
from @myXml.nodes('/root/line') t(c)
Run Code Online (Sandbox Code Playgroud)

虽然我现在得到了结果,但结果却有一定的怪异.指定的命名空间将添加为"p1"而不是默认值.所以我的输出看起来像这样:

<p1:line xmlns:p1="urn:somename" id="1" />
Run Code Online (Sandbox Code Playgroud)

这篇Technet文章中,B部分声明一个默认命名空间显示了我正在尝试实现的内容,但是我使用默认命名空间得到了D. Construction中显示的结果.由于我的例子看起来不像后者,我不明白为什么我会得到这些前缀.

更新: 为了完整起见,这提供了与xmlnamespaces语法完全相同的症状:

select t.c.query('.')
from @myXml.nodes('declare default …
Run Code Online (Sandbox Code Playgroud)

xml sql sql-server xquery xquery-sql

5
推荐指数
1
解决办法
4668
查看次数

将xml递归地分解到数据库中

我有以下XML数据和Element表.

DECLARE @input XML = '<root>
     <C1>
       <C2>
         <C3>           <C4>data1</C4>       </C3>         
       </C2>
       <C2>
         <C3>data2</C3>
       </C2>
     </C1>
     <D1>
        <D2>data3</D2>
        <D2>data4</D2>
     </D1>
    </root>'
Run Code Online (Sandbox Code Playgroud)

元素表:(这只是一个例子,因此可以更改以匹配适当的解决方案.)

CREATE TABLE Element (  elementId INT IDENTITY PRIMARY KEY, 
elementName VARCHAR (200) NOT NULL, 
parentId INT,   
data VARCHAR(300) );
Run Code Online (Sandbox Code Playgroud)

根据@input,根元素是C1和D1的父元素,那么C1是C2父元素,...

SQL Server 2012/2014使用CTE(或任何其他类型的SQL对象)对存储过程进行编码以递归方式将所有元素名称放入Element表中的解决方案是什么?

在这种情况下,数据列填充数据,C4和第二C3以及D2元素具有其余元素为空的数据.

我也看到了Hierarchical Data类型,我想知道这是否有助于解决这个问题?

xml sql sql-server xquery xquery-sql

5
推荐指数
1
解决办法
946
查看次数

XQuery SQL XML 中的 query() 与 value()

以下哪一个查询性能更好?

--query a
Select *
UserDefXml.query('/Product/ProductName/text()')
From ProductsDB.dbo.ProductsTable

--query b
Select * 
UserDefXml.value('(/Product/ProductName)[1]','varchar(max)')
From ProductsDB.dbo.ProductsTable
Run Code Online (Sandbox Code Playgroud)

对于其中每一个,推荐的场景是什么?还有其他方法可以实现此目的吗?

谢谢。

sql-server xquery-sql sql-server-2012

5
推荐指数
0
解决办法
1443
查看次数

Nvarchar(max)字段中的SQL Server查询XML?

我将XML存储在nvarchar(max)字段中.我意识到有一种XML数据类型,但在这种情况下它不会以这种方式存储.假设XML的结构如下:

<root>
<hdr>
  <name>aj</name>
</hdr>
<dtls>
  <dtl>
    <price>1</price>
  </dtl>
  <dtl>
    <price>7</price>
  </dtl>
  <dtl>
    <price>3</price>
  </dtl>
</dtls>
</root>
Run Code Online (Sandbox Code Playgroud)

我要做的是获取存在记录的详细信息(dtl)节点.我确信这可以用xpath/xquery,我只是不确定如何.

sql-server xquery-sql

4
推荐指数
1
解决办法
6259
查看次数

Sql server中的FLWOR计数命中数

我正在使用SQL Server 2008 R2.我的问题是我想要计算使用FLWOR从XQuery查询收到的点击次数.对于每次点击,我想要一个连续的数字,如:0,1,2,3,4 ......

我的查询:

select @xml.query('for $s at $count in /Root/Persons/Person
return <Person ID="{$count}">{$s}</Person>')
Run Code Online (Sandbox Code Playgroud)

这里唯一的问题是SQL Server不支持这个问题,我收到一个错误:

Msg 9335, Level 16, State 1, Line 16
XQuery [query()]: The XQuery syntax 'at' is not supported.
Run Code Online (Sandbox Code Playgroud)

我也尝试过let关键字并定义新变量,但我不知道如何在每次迭代时增加该变量的值?

感谢所有答案,弗伦基

xquery sql-server-2008-r2 xquery-sql flwor

4
推荐指数
1
解决办法
1186
查看次数