Я хочу получить наименьшее значение в иерархии динамического XML-файла.
Я пытаюсь написать динамическое выражение для чтения из файла XML:
patdata.value('(*[local-name() = sql:column("DataMng.Root")]/*[local-name() = sql:column("textMng.FieldId")]/text())[1]', 'nvarchar(max)')
DataMng.Root= 'rc0036'
FieldId='s4356/L4356/F4357'
но я получаю **NULL **, хотя в этом XML-файле есть значение.
Когда я пишу следующее выражение, я получаю нужный результат:
patdata.value('(*[local-name() = sql:column("DataMng.Root")]/s4356/L4356/F4357/text())[1]', 'nvarchar(max)')
есть XML-файл:
<rc0036>
<F2739>9893</F2739>
<F2740>12</F2740>
<F2741>ד"ר נאג'ד יאסין</F2741>
<F0242>16/04/2024</F0242>
<F5453>16/04/2024</F5453>
<F4301>16/04/2024</F4301>
<F5454>מרינה</F5454>
<F1209>מרינה</F1209>
<F1903>מעקב זקיקים</F1903>
<F0984>מרינה</F0984>
<F0308>01/04/2024</F0308>
<F0415>וגינלי</F0415>
<F2966>טיפול</F2966>
<s4356>
<L4356 line = "1">
<F0418>16/04/2024</F0418>
<F0462>16</F0462>
<F0071>100</F0071>
<F0987>בינוני</F0987>
<F4357>5</F4357>
<F4357>6</F4357>
<F1617>מרינה</F1617>
<F1013/>
</L4356>
</s4356>
</rc0036>
Знаете ли вы, что функция local-name()
XPath относится к одному узлу, а не к иерархии? то есть: если вы подадите ему набор узлов, он будет работать только на первом узле.
Пожалуйста, не используйте изображения... Добавьте XML к вопросу в виде текста.
Я добавил XML как текст
Поскольку SQL Server не позволяет вам указывать динамические XPath для XML-методов query()
, nodes()
и value()
, даже с помощью трюков sql:column()
и sql:variable()
, рассматривали ли вы возможность решить проблему? то есть: используйте CTE для уничтожения XML-генерирующих XPath для каждого узла, а затем сопоставьте сгенерированные XPath с вашим выражением, чтобы вернуть значение этого узла.
Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и образец набора данных, т. е. таблицы CREATE плюс инструкции INSERT T-SQL. (2) Что вам нужно сделать, т. е. логику и попытку реализации вашего кода в T-SQL. (3) Желаемый результат, основанный на примере данных в пункте 1 выше. (4) Версия вашего SQL-сервера (ВЫБЕРИТЕ @@version;). Все в вопросе в виде текста, без изображений.
Минимальный воспроизводимый пример не приведен. Итак, я стреляю от бедра.
Вот несколько способов сделать это.
Первый метод — хак.
2-й способ гораздо надежнее. Он использует выражение XQuery FLWOR.
SQL
DECLARE @xml XML =
N'<rc0036>
<F2739>9893</F2739>
<F2740>12</F2740>
<F0242>16/04/2024</F0242>
<F5453>16/04/2024</F5453>
<F4301>16/04/2024</F4301>
<F5454>מרינה</F5454>
<F1209>מרינה</F1209>
<F1903>מעקב זקיקים</F1903>
<F0984>מרינה</F0984>
<F0308>01/04/2024</F0308>
<F0415>וגינלי</F0415>
<F2966>טיפול</F2966>
<s4356>
<L4356 line = "1">
<F0418>16/04/2024</F0418>
<F0462>16</F0462>
<F0071>100</F0071>
<F0987>בינוני</F0987>
<F4357>5</F4357>
<F4357>6</F4357>
<F1617>מרינה</F1617>
<F1013/>
</L4356>
</s4356>
</rc0036>';
SELECT @xml.value('min(//*)', 'INT') AS result;
SELECT @xml.query('
for $x in min(//*[xs:int(text()[1]) instance of xs:int])
return $x
').value('.', 'INT') AS result;
SELECT REPLACE(@xml.query('data(/rc0036/s4356/L4356/F4357/text())')
.value('.', 'VARCHAR(20)'), SPACE(1),',') AS result;
Выход №1
Выход №2
Удивительный!! Спасибо! как теперь экспортировать все данные под этим тегом в одну строку? Я имею в виду, что результат будет 5,6 (под тегом s4356/L4356/F4357).
Я обновил ответ. Проверьте это.
Я добавил изображение части XML-файла.