0

我的任务是记录我们数据库中的存储过程和函数,我遇到了一个我不确定它实际上在做什么的问题。

通过查看和搜索部分代码,我相信它正在获取一个 XML 字符串,该字符串被传递给函数并将其与 ID 号合并。但是我不确定这是否正确

ALTER FUNCTION [dbo].[GetMergeItem]
(
@MergeData xml,
@MergeItemId nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
DECLARE @MergeItemText nvarchar(max)

SELECT @MergeItemText = @MergeData.value('(/ArrayOfMergeFieldJson/MergeFieldJson[Id/text()=sql:variable("@MergeItemId")]/Text/text())[1]', 'nvarchar(max)') 
RETURN @MergeItemText
END

谁能告诉我我认为它的做法是否正确,如果不解释它实际上在做什么?

4

2 回答 2

1

这是我认为引起您困惑的一点。

SELECT @MergeItemText = @MergeData.value('(/ArrayOfMergeFieldJson/MergeFieldJson[Id/text()=sql:variable("@MergeItemId")]/Text/text())[1]', 'nvarchar(max)') 

这里发生的是 .value 方法返回单个值(因此是标量)。

括号的第一部分使用 xpath 查询导航到 xml 结构中的相关节点。部分向下看起来 MergeFieldJson 节点中有多个属性,因此它以方括号开头,表示要在此处指定位置。然后,代码在其中使用传入的 id 值说明要使用的位置(1 是第一个位置)以继续从中进行路径。然后 xpath 从那里继续另外 2 个节点,并返回在 /text 节点中找到的第一个值。

然后该函数将值作为 nvarchar(max) 返回。

于 2019-06-13T10:54:50.070 回答
0

它使用 .value() xml 数据类型方法并查找与 @MergeItemId 匹配的元素并返回一个标量值。更多细节 .value()

于 2019-06-13T10:48:16.330 回答