gpt4 book ai didi

sql-server - SQL Server XML.value上下文节点

转载 作者:行者123 更新时间:2023-12-03 08:26:16 26 4
gpt4 key购买 nike

我为用户提供了我们正在使用的工具的计算变量的可能性。值由给定的XPath表达式计算。在.Net中,使用Saxon库,可以通过在要计算的值的上下文中执行XPath表达式来计算值。

XML示例:

@data = '<Object>
<Parameters>
<Parameter Name="a">2</Parameter>
<Parameter Name="b">5</Parameter>
<Parameter Name="c"/>
</Parameters>
</Object>'


名称为“ c”的Parameter上下文中的示例XPath表达式:

../Parameter[@Name="a"]/text() + ../Parameter[@Name="b"]/text()


这将导致7;)

我喜欢在SQL Server上执行XPath表达式,但是现在已经知道如何更改XML类型的上下文节点?

一种可能是,我在表达式的前面添加了一个XPath来更改上下文,但是没有找到是否可行。查询可能看起来像:

/<go to node variable "c" and make this the context node>

../Parameter[@Name="a"]/text() + ../Parameter[@Name="b"]/text()


有人有好主意吗?

最佳答案

您想要的是-AFAIK-不可能...

尝试使用您的XPath表达式定义一个有效的查询:

顺便说一句:您的示例在两个方面是错误的:XML中的属性没有@标记,而关闭的Parameters标记缺少其最后的“ s” ...

DECLARE @data XML=
'<Object>
<Parameters>
<Parameter Name="a">2</Parameter>
<Parameter Name="b">5</Parameter>
<Parameter Name="c"/>
</Parameters>
</Object>';

--This will not work, because your parts are not singleton
--SELECT Context.Node.value('../Parameter[@Name="a"]/text() + ../Parameter[@Name="b"]/text()','int')
--FROM @data.nodes('/Object/Parameters/Parameter[@Name="c"]') AS Context(Node);

--This works, because I framed both parts with (...)[1]
SELECT Context.Node.value('(../Parameter[@Name="a"]/text())[1] + (../Parameter[@Name="b"]/text())[1]','int')
FROM @data.nodes('/Object/Parameters/Parameter[@Name="c"]') AS Context(Node);


但是可能有一种解决方法,但是它很hacky并且不可靠:

存储过程将创建一个根据您的参数构建的动态sql语句,并执行该语句。

您必须更改的XPath表达式将以以下方式更改:替换在左侧和右侧带有空白的 +(以及 -*/)顺便说一句,有一个单例表达式返回。我不知道计算的复杂程度。看看这个...

CREATE PROCEDURE dbo.CalculateXPathExpression
(
@data XML
,@XPathContextNode VARCHAR(MAX)
,@XPathCalculation VARCHAR(MAX)
)
AS
BEGIN
DECLARE @Return INT;
DECLARE @CalcSingleton VARCHAR(MAX)='(' + REPLACE(REPLACE(REPLACE(REPLACE(@XPathCalculation,' + ',')[1] + ('),' - ',')[1] + ('),' * ',')[1] + ('),' / ',')[1] + (') + ')[1]';
DECLARE @Cmd NVARCHAR(MAX)=
'SELECT @Return = Context.Node.value(''' + @CalcSingleton + ''',''int'')
FROM @data.nodes(''' + @XPathContextNode + ''') AS Context(Node);';

EXEC sp_executesql @Cmd, N'@data XML, @Return INT OUTPUT',@data=@data, @Return=@Return OUTPUT;

SELECT @Return;

RETURN;
END
GO

DECLARE @data XML=
'<Object>
<Parameters>
<Parameter Name="a">2</Parameter>
<Parameter Name="b">5</Parameter>
<Parameter Name="c"/>
</Parameters>
</Object>';

DECLARE @XPathContextNode VARCHAR(MAX)='/Object/Parameters/Parameter[@Name="c"]';
DECLARE @XPathCalculation VARCHAR(MAX)='../Parameter[@Name="a"]/text() + ../Parameter[@Name="b"]/text()';

EXEC dbo.CalculateXPathExpression @data, @XPathContextNode, @XPathCalculation;
GO

DROP PROCEDURE dbo.CalculateXPathExpression;
GO

关于sql-server - SQL Server XML.value上下文节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35117457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com