Академический Документы
Профессиональный Документы
Культура Документы
Для формирования структуры XML-документа со списком значений можно воспользоваться режимом PATH для FOR XML в
T-SQL.
<root>
<level1>
<level2></level2> Реклама
<values>
<value></value>
<value></value>
<value></value>
<value></value>
<value></value>
</values>
</level1>
<level1>
<level2></level2>
<values>
<value></value>
<value></value>
<value></value>
<value></value>
<value></value>
</values>
</level1>
</root>
Ниже представлен sql код создания тестовых таблиц для демонстрации запросов:
1 Class_1
2 Class_2
3 Class_3
Запросы будут задействовать две таблицы dbo.ProductClass и dbo.Product со связью «один ко многим»(в одном классе может
быть более одного продукта).
1 1 Product_1
2 2 Product_2
3 3 Product_3
1 4 Product_4
2 5 Product_5
3 6 Product_6
1 7 Product_7
3 8 Product_8
2 9 Product_9
1 10 Product_10
Следующий запрос позволяет построить XML документ со списком значений ProductName таблицы dbo.Product для каждого
класса продукта(ProductClassName) в одноименных элементах:
Псевдонимы определяют «имена» XML элементов. Директива TYPE позволяет получить результат запроса в виде типа данных
xml. Для того что бы не формировался родительский элемент для списка значений элементов Product.ProductName, значение
PATH не указывается(for xml path('')).
<ProductClass>
<ProductClassName>Class_1</ProductClassName>
<Products>
<ProductName>Product_1</ProductName>
<ProductName>Product_4</ProductName>
<ProductName>Product_7</ProductName>
<ProductName>Product_10</ProductName>
</Products>
</ProductClass>
<ProductClass>
<ProductClassName>Class_2</ProductClassName>
<Products>
<ProductName>Product_2</ProductName>
<ProductName>Product_5</ProductName>
<ProductName>Product_9</ProductName>
</Products>
</ProductClass>
<ProductClass>
<ProductClassName>Class_3</ProductClassName>
<Products>
<ProductName>Product_3</ProductName>
<ProductName>Product_6</ProductName>
<ProductName>Product_8</ProductName>
</Products>
</ProductClass>
Для создания списка со значениями в атрибутах элемента, псевдонимы указываются в кавычках(одинарные или двойные) с
символом '@' в начале:
Значение PATH есть «имя» элемента в котором содержаться атрибуты, результ запроса следующий:
<ProductClass>
<ProductClassName>Class_1</ProductClassName>
<Products>
<Product ProductId="1" ProductName="Product_1" />
<Product ProductId="4" ProductName="Product_4" />
<Product ProductId="7" ProductName="Product_7" />
<Product ProductId="10" ProductName="Product_10" />
</Products>
</ProductClass>
<ProductClass>
<ProductClassName>Class_2</ProductClassName>
<Products>
<Product ProductId="2" ProductName="Product_2" />
<Product ProductId="5" ProductName="Product_5" />
<Product ProductId="9" ProductName="Product_9" />
</Products>
</ProductClass>
<ProductClass>
<ProductClassName>Class_3</ProductClassName>
<Products>
<Product ProductId="3" ProductName="Product_3" />
<Product ProductId="6" ProductName="Product_6" />
<Product ProductId="8" ProductName="Product_8" />
</Products>
</ProductClass>
Результат запроса:
<ProductClass>
<ProductClassName>Class_1</ProductClassName>
<Products>
<Product ProductId="1">
<ProductName>Product_1</ProductName>
</Product>
<Product ProductId="4">
<ProductName>Product_4</ProductName>
</Product>
<Product ProductId="7">
<ProductName>Product_7</ProductName>
</Product>
<Product ProductId="10">
<ProductName>Product_10</ProductName>
</Product>
</Products>
</ProductClass>
<ProductClass>
<ProductClassName>Class_2</ProductClassName>
<Products>
<Product ProductId="2">
<ProductName>Product_2</ProductName>
</Product>
<Product ProductId="5">
<ProductName>Product_5</ProductName>
</Product>
<Product ProductId="9">
<ProductName>Product_9</ProductName>
</Product>
</Products>
</ProductClass>
<ProductClass>
<ProductClassName>Class_3</ProductClassName>
<Products>
<Product ProductId="3">
<ProductName>Product_3</ProductName>
</Product>
<Product ProductId="6">
<ProductName>Product_6</ProductName>
</Product>
<Product ProductId="8">
<ProductName>Product_8</ProductName>
</Product>
</Products>
</ProductClass>
Product.ProductName как значение элемента Product и Product.ProductId как значение атрибута этого же элемента:
Результат:
<ProductClass>
<ProductClassName>Class_1</ProductClassName>
<Products>
<Product ProductId="1">Product_1</Product>
<Product ProductId="4">Product_4</Product>
<Product ProductId="7">Product_7</Product>
<Product ProductId="10">Product_10</Product>
</Products>
</ProductClass>
<ProductClass>
<ProductClassName>Class_2</ProductClassName>
<Products>
<Product ProductId="2">Product_2</Product>
<Product ProductId="5">Product_5</Product>
<Product ProductId="9">Product_9</Product>
</Products>
</ProductClass>
<ProductClass>
<ProductClassName>Class_3</ProductClassName>
<Products>
<Product ProductId="3">Product_3</Product>
<Product ProductId="6">Product_6</Product>
<Product ProductId="8">Product_8</Product>
</Products>
</ProductClass>
Конструкция data() позволяет сформировать список значений, например требуется перечислить все значения ProductId для
каждого класса продукта в элементе ProductClass:
+5 16 1,6k 9 Поделиться
6,0 0,0
Карма Рейтинг
ПОХОЖИЕ ПУБЛИКАЦИИ
Открытый вебинар «Порядок выполнения запроса SELECT и план запроса в MS SQL Server»
+7 4,5k 26 7
+16 4,4k 21 0
КУРСЫ
Тренажер product-менеджера
17 сентября 2020 • 3 месяца • 43 900 ₽ • SkillFactory
Факультет Go-разработки
20 сентября 2020 • 18 месяцев • 270 000 ₽ • GeekBrains
Геймдизайнер
21 сентября 2020 • 6 месяцев • 66 100 ₽ • Нетология
Реклама
Комментарии 9
Doomsday_nxt 24 июня 2020 в 13:35 0
Одно я заметил — все эти XML-функции ужасно медленные. В моих случаях проще было обработку XML делать на клиенте.
Возможно стоит сделать некий замер скорости формирования XML с помощью средств T-SQL и например технологии LINQ to XML в
C#
И добавить ещё SQLCLR. Да, такой замер был бы интересен (и в обе стороны — в MSSQL есть поля XML, их которых можно
извлекать данные).
Автором комментария имелась ввиду интеграция SQL Server со средой CLR инфраструктуры .NET Framework. Например,
формирование XML-документа можно реализовать в виде хранимой процедуры или пользовательской функции для SQL
Server на языке C#. Подробнее можно посмотреть тут.
Это понятно, я вот и спрашиваю: с какой версией Net Framework интегрируется? В SqlServer 2017 всё еще была
версия .Net Framework 2.0. Или как указать целевую версию…
Для SQL Server версия .NET Framework не важна. Код, который вы пишите на С# или VB компилируется в байт-код CIL,
общий для CLR.
XML из статьи
Коли используется одно пространство имён для всех элементов то достаточно его добавить
поумолчанию и все эти префиксы будут не нужны.
Судя по справке в WITH XMLNAMESPACES можно задать пространство имён поумолчанию указав только URI.
<ProductClass xmlns="uri1">
<ProductClassName>Class_1</ProductClassName>
<Products>
<ProductName>Product_1</ProductName>
<ProductName>Product_4</ProductName>
<ProductName>Product_7</ProductName>
<ProductName>Product_10</ProductName>
</Products>
</ProductClass>
<ProductClass xmlns="uri1">
<ProductClassName>Class_2</ProductClassName>
<Products>
<ProductName>Product_2</ProductName>
<ProductName>Product_5</ProductName>
<ProductName>Product_9</ProductName>
</Products>
</ProductClass>
<ProductClass xmlns="uri1">
<ProductClassName>Class_3</ProductClassName>
<Products>
<ProductName>Product_3</ProductName>
<ProductName>Product_6</ProductName>
<ProductName>Product_8</ProductName>
</Products>
</ProductClass>
Здесь всем элементам задано пространство имён и нет перегруза определениями и префиксами.
Да, вы правы. Для понимания Ваш вариант лучше, в ближайшее время внесу изменения. Спасибо за замечание
САМОЕ ЧИТАЕМОЕ
+33 22k 56 43
+47 7,5k 17 16
Мегатест
Ваш аккаунт Разделы Информация Услуги
© 2006 – 2020 «Habr» Настройка языка О сайте Служба поддержки Мобильная версия