Пытаясь понять, что делает скалярная функция - PullRequest
0 голосов
/ 13 июня 2019

Мне было поручено документировать хранимые процедуры и функции в нашей базе данных, и я наткнулся на одну, которую я не уверен, что она на самом деле делает.

Из анализа и поиска частей кода я считаю, что он берет строку XML, которая передается функции, и объединяет ее с идентификационным номером. Однако я не уверен, если это правильно

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

Может кто-нибудь сказать мне, правильно ли то, что я думаю, что он делает, а если нет, то объяснить, что он на самом деле делает?

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Это бит, который, как я полагаю, вызывает ваше замешательство.

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

В данном случае метод .value возвращает одно значение (следовательно, скалярное).

В первой части скобок используется запрос xpath для перехода к соответствующему узлу в структуре xml. Часть пути вниз выглядит так, как будто в узле MergeFieldJson есть несколько атрибутов, поэтому он начинается с квадратной скобки, обозначающей, что здесь должна быть указана позиция. Затем в этом коде указывается, какую позицию использовать (1 - первая позиция), используя переданное значение id для продолжения пути. Затем xpath продолжает 2 дальнейших узла и возвращает первое значение, найденное в узле / text.

функция затем возвращает значение как nvarchar (max).

0 голосов
/ 13 июня 2019

Он использует методы типа данных .value () xml и ищет элемент, который соответствует @MergeItemId, и возвращает скалярное значение.Для более подробной информации .value ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...