我想使用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)值.
更新以提供说明
这是我遇到问题的一个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) 我想知道如何使用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)
任何帮助,将不胜感激
如何在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) 我的公司有一个记录表,其中包含一个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) 举个简单的例子:
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数据和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类型,我想知道这是否有助于解决这个问题?
以下哪一个查询性能更好?
--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)
对于其中每一个,推荐的场景是什么?还有其他方法可以实现此目的吗?
谢谢。
我将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 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 ×10
sql-server ×6
sql ×4
xml ×4
xquery ×3
t-sql ×2
casting ×1
flwor ×1
replace ×1
validation ×1