[英]XQuery - iterate over every attribute
我正在尝试使用这种结构迭代 XML:
<Query id="Y120-M2-D1-H8-M42-S12-MS276-6676" name="Transactions_ModelGenerator_v_1.0.0.104">
<Description />
<Columns>
<Column caption="Client Code" sorting="None" sortIndex="-1">
<Expr class="ENTATTR" id="c.Number" />
</Column>
<Column caption="Client Name" sorting="None" sortIndex="-1">
<Expr class="ENTATTR" id="c.Name" />
</Column>
<Column caption="Market Code" sorting="None" sortIndex="-1">
<Expr class="ENTATTR" id="r.Number" />
</Column>
<Column caption="Market Name" sorting="None" sortIndex="-1">
<Expr class="ENTATTR" id="r.Name" />
</Column>
</Columns>
<JustSortedColumns />
<Conditions linking="All">
<Condition class="SMPL" enabled="True" readOnly="False">
<Operator id="Equal" />
<Expressions>
<Expr class="ENTATTR" id="c.Number" />
<Expr class="CONST" type="String" kind="Scalar" value="A1B" text="A1B" />
</Expressions>
</Condition>
<Condition class="SMPL" enabled="True" readOnly="False">
<Operator id="Equal" />
<Expressions>
<Expr class="ENTATTR" id="ConversionCurrency" />
<Expr class="CONST" type="String" kind="Scalar" value="EUR" text="EUR" />
</Expressions>
</Condition>
</Conditions>
</Query>
我想遍历列,并替换某些关键字,特别是标题属性。 例如,我想用“Cedent”替换关键字“Client”。
我试过写这样的东西:
update #data
set data.modify('
for $col in /Query/Columns[1]/Column/caption
replace value of $col with fn:replace($col, "Client", "Cedent")
where fn:contains($col, "Client")
')
但当然我收到错误我不知道如何解决:
XQuery [#data.data.modify()]: Syntax error near 'replace', expected 'where', '(stable) order by' or 'return'.
我对 XQuery 不是很熟悉。 有人可以帮我吗?
for $col in /Query/Columns[1]/Column/@caption[fn:contains(., "Client")]
let $x := fn:replace($col, "Client", "Cedent")
return replace value of node $col with $x
不幸的是, .modify()
方法一次只能更新一个值。
由于 MS SQL Server 缺乏对XQuery 、 Xpath等最新 w3c 标准的支持,因此非常难看。
SQL
DECLARE @xml XML = N'<Query id="Y120-M2-D1-H8-M42-S12-MS276-6676" name="Transactions_ModelGenerator_v_1.0.0.104">
<Description/>
<Columns>
<Column caption="Client Code" sorting="None" sortIndex="-1">
<Expr class="ENTATTR" id="c.Number"/>
</Column>
<Column caption="Client Name" sorting="None" sortIndex="-1">
<Expr class="ENTATTR" id="c.Name"/>
</Column>
<Column caption="Market Code" sorting="None" sortIndex="-1">
<Expr class="ENTATTR" id="r.Number"/>
</Column>
<Column caption="Market Name" sorting="None" sortIndex="-1">
<Expr class="ENTATTR" id="r.Name"/>
</Column>
</Columns>
<JustSortedColumns/>
<Conditions linking="All">
<Condition class="SMPL" enabled="True" readOnly="False">
<Operator id="Equal"/>
<Expressions>
<Expr class="ENTATTR" id="c.Number"/>
<Expr class="CONST" type="String" kind="Scalar" value="A1B" text="A1B"/>
</Expressions>
</Condition>
<Condition class="SMPL" enabled="True" readOnly="False">
<Operator id="Equal"/>
<Expressions>
<Expr class="ENTATTR" id="ConversionCurrency"/>
<Expr class="CONST" type="String" kind="Scalar" value="EUR" text="EUR"/>
</Expressions>
</Condition>
</Conditions>
</Query>';
DECLARE @oldValue VARCHAR(10) = 'Client'
, @NewValue VARCHAR(10) = 'Cedent'
, @caption VARCHAR(30);
WHILE @xml.exist('/Query/Columns/Column[fn:contains(@caption, sql:variable("@oldValue"))]') = 1
BEGIN
SET @caption = @xml.value('(/Query/Columns/Column[fn:contains(@caption, sql:variable("@oldValue"))]/@caption)[1]','VARCHAR(30)');
SET @caption = REPLACE(@caption, @oldValue, @NewValue);
SET @xml.modify('replace value of
(/Query/Columns/Column[fn:contains(@caption, sql:variable("@oldValue"))]/@caption)[1] with (sql:variable("@caption"))');
END
-- after
SELECT @xml;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.