Экспорт данных из динамической иерархии XML в SQL Server

Я хочу получить наименьшее значение в иерархии динамического 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>

Я добавил изображение части XML-файла.

Ravit Shagan Damti 30.04.2024 11:14

Знаете ли вы, что функция local-name() XPath относится к одному узлу, а не к иерархии? то есть: если вы подадите ему набор узлов, он будет работать только на первом узле.

AlwaysLearning 30.04.2024 11:24

Пожалуйста, не используйте изображения... Добавьте XML к вопросу в виде текста.

Dale K 30.04.2024 11:30

Я добавил XML как текст

Ravit Shagan Damti 30.04.2024 12:04

Поскольку SQL Server не позволяет вам указывать динамические XPath для XML-методов query(), nodes() и value(), даже с помощью трюков sql:column() и sql:variable(), рассматривали ли вы возможность решить проблему? то есть: используйте CTE для уничтожения XML-генерирующих XPath для каждого узла, а затем сопоставьте сгенерированные XPath с вашим выражением, чтобы вернуть значение этого узла.

AlwaysLearning 30.04.2024 13:05

Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и образец набора данных, т. е. таблицы CREATE плюс инструкции INSERT T-SQL. (2) Что вам нужно сделать, т. е. логику и попытку реализации вашего кода в T-SQL. (3) Желаемый результат, основанный на примере данных в пункте 1 выше. (4) Версия вашего SQL-сервера (ВЫБЕРИТЕ @@version;). Все в вопросе в виде текста, без изображений.

Yitzhak Khabinsky 01.05.2024 04:13
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
6
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Минимальный воспроизводимый пример не приведен. Итак, я стреляю от бедра.

Вот несколько способов сделать это.

Первый метод — хак.

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

результат 5

Выход №2

результат 5,6

Удивительный!! Спасибо! как теперь экспортировать все данные под этим тегом в одну строку? Я имею в виду, что результат будет 5,6 (под тегом s4356/L4356/F4357).

Ravit Shagan Damti 02.05.2024 08:15

Я обновил ответ. Проверьте это.

Yitzhak Khabinsky 02.05.2024 13:43

Другие вопросы по теме