Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Вопросы и ответы по MS SQL Server" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Декабрь 2004 → | ||||||
1
|
2
|
3
|
4
|
5
|
||
---|---|---|---|---|---|---|
7
|
8
|
9
|
10
|
11
|
12
|
|
14
|
15
|
16
|
17
|
18
|
19
|
|
20
|
22
|
23
|
24
|
25
|
26
|
|
27
|
28
|
29
|
31
|
Статистика
-20 за неделю
MS SQL Server - дело тонкое...
Информационный Канал Subscribe.Ru |
#226<< #227 |
СОДЕРЖАНИЕ Поддержка XML в Microsoft SQL Server 2005 (продолжение)
По материалам статьи
XML Support in Microsoft SQL Server 2005
Shankar Pal, Mark Fussell, and Irwin Dolobowsky
Мотивация для хранения XML Данные в виде XML становятся все более распространенными. Они могут представлять данные пользователя с описывающими их схемами XML или без них. И данные XML, и схемы XML должны использоваться вместе. Схемы XML для реальных приложений часто сложны, и конвертация этих схем XML в таблицы и столбцы -сложная задача. Осуществление такой конвертации в то время, когда изменяются схемы XML или добавляются новые, становится проблематичным. Довольно часто данные XML хранятся в файловой системе или в текстовом столбце на сервере базы данных. Текстовые столбцы имеют такие преимущества управления данными, как репликация и резервное копирование/восстановление, но не поддерживают запросы, основанные на структуре данных XML. С встроенной поддержкой XML разработка приложений, использующих XML, становится быстрее. Управление свойствами пользователем Некоторые приложения, такие, как приложения с пользовательским интерфейсом, позволяют пользователям выбирать из фиксированного набора свойств. Другие позволяют пользователям определять собственные, необходимые им свойства. Такими пользовательскими свойствами можно управлять, если они хранятся в формате XML. Приложения могут поддерживать не только скалярные свойства: - могут поддерживаться свойства объектов с множеством значений, такие, как множество номера телефонов; - также могут поддерживаться сложные свойства, например, свойство автора документа может являться контактной информацией автора; - объектные свойства могут храниться в столбце типа XML и индексироваться для эффективной обработки запроса. Обмен данными XML позволяет осуществлять платформо-независимый обмен данными между приложениями. Такие данные могут быть смоделированы как сообщения с разметкой XML. Вместо постоянного создания и удаления сообщений XML, разумнее хранить сообщения в формате XML. Это хорошо сочетается с требованиями обмена данными. Приходящее сообщение XML содержит текущее состояние. Каждое сообщение обрабатывается, изменения записываются в содержимое XML, и данные XML передаются дальше. Сообщения могут быть разных типов или даже могут быть только частично структурированными, иметь разные схемы XML, так что их конвертация в таблицы не всегда является простой задачей. Стандарты, основанные на XML, появляются для различных вертикальных доменов, такие, как финансовые и географические данные. Эти стандарты описывают структуру данных, зависящую от того, какие именно данные могут быть запрошены и обновлены. Довольно часто сами данные хранятся в двоичной форме, в то время как данные XML хранят метаданные об этих данных. Приведем простой пример: чтобы передать таблицу входных параметров в хранимую процедуру или функцию, приложение конвертирует данные в XML и передает их как параметр типа XML. Внутри хранимой процедуры или функции из параметра XML вновь создается набор строк. Управление документами Предположим, что справочная служба хранит данные о пациентах и записи разговоров с ними в виде документа XML. Когда звонит пациент, то справочной службе нужно получить данные о предыдущем разговоре, чтобы знать, о чем может идти речь в текущем звонке. Это возможно с помощью запроса XML, что дает преимущества приложению. Т.е. облегчается получение информации о предыдущих разговорах и записи текущего разговора. Документы, такие, как e-mail, только частично структурированы по своей сути. Документы с разметкой XML легче создавать, например, с помощью Office 2003. Эти документы XML могут храниться в столбцах XML, индексироваться, запрашиваться и обновляться. Таким образом, разработчики могут делать больше со встроенной поддержкой XML. Обработка XML на стороне сервера в SQL Server 2005 В SQL Server 2005 Вы можете хранить в одной базе данных и реляционные данные, и данные XML. Тип данных XML Вы можете создать таблицу со столбцом XML, используя обычную команду CREATE TABLE. Столбец XML может быть проиндексирован особым образом. Нетипизированный XML Тип данных XML в SQL Server 2005 соответствует стандарту ISO SQL-2003 типа данных XML. Поэтому он может хранить не только хорошо структурированные документы XML 1.0, но также и так называемые фрагменты контента XML с текстовыми узлами и произвольным количеством элементов высокого уровня. При этом выполняются проверки на структурированность данных, что не требует привязки данных XML к схемам XML, и плохо структурированные данные не принимаются. Нетипизированный XML полезен, когда схема заранее неизвестна, так что решение, основанное на конвертации, невозможно, а также когда схема известна, но конвертация в реляционную модель очень сложна и тяжела в поддержке, или когда существует множество схем, которые сопоставляются данным позже в зависимости от на внешних требований. Пример: столбец с нетипизированным XML в таблице Следующая команда создает таблицу "docs" с первичным ключом типа integer "pk" и столбцом с нетипизированным XML "xCol": CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null) Таблица может быть создана с более чем одним XML или реляционным столбцом с наличием или без наличия первичного ключа. Типизированный XML Если у вас есть схемы XML в коллекции схем XML, описывающие ваши данные XML, то вы можете сопоставить коллекцию схем XML со столбцом XML, чтобы получить типизированный XML. Схемы XML используются для проверки данных, выполнения более точных проверок типа по сравнению с нетипизированным XML во время компиляции запросов и команд модификации данных, и оптимизации хранения и обработки запросов. Типизированные столбцы, параметры и переменные XML могут хранить документы или контент XML, что указывается при помощи опции (DOCUMENT или CONTENT, соответственно, CONTENT по умолчанию) во время объявления. Более того, вам нужно обеспечить коллекцию схем XML. Указывайте DOCUMENT, если каждый экземпляр XML имеет один элемент верхнего уровня, иначе указывайте CONTENT. Компилятор запроса, видя установленный флажок DOCUMENT, подразумевает, что у экземпляра XML есть только один элемент верхнего уровня. Пример: типизированный столбец XML в таблице Столбцы, переменные и параметры XML могут быть сопоставлены коллекции схем XML (см. главу "Обработка схем XML" далее в этой статье для более подробного объяснения и большего количества примеров). Предположим, что myCollection является такой коллекцией. Команда, показанная ниже, создает таблицу XmlCatalog со столбцом типизированного XML Document, используя myCollection. Для столбца типизированного XML также указано, что он может хранить и фрагменты XML, а не только документы XML. CREATE TABLE XmlCatalog ( ID INT PRIMARY KEY, Document XML(CONTENT myCollection)) Ограничения столбцов типа XML Кроме типизации столбца XML, Вы также можете использовать реляционные (для столбца или строки) ограничения на столбцах типизированного и нетипизированного XML. Вообще большинство ограничений SQL применимы к столбцам XML, исключениями являются ограничения уникального, первичного и внешнего ключей, т.к. экземпляры данных XML нельзя сравнивать. Таким образом, Вы можете указать, что столбец XML может или не может содержать значение NULL, определить у него значение по умолчанию и ограничение CHECK. Например, нетипизированный столбец XML может иметь ограничение CHECK для проверки, что хранимые экземпляры XML соответствуют схеме XML. Используйте ограничения, исходя из следующих условий: - Ваши бизнес-правила не могут быть представлены в схемах XML. Например, адрес доставки заказа из цветочного магазина должен находиться в пределах 50 миль от него, что может быть указано в виде ограничения столбца XML. Ограничение может включать методы для работы с типом XML. - Ваши ограничения включают другие XML или не XML столбцы в таблице. Например, ограничением является требование, чтобы ID покупателя (/Customer/@CustId) в экземпляре XML соответствовал значению столбца CustomerID типа integer. Пример: ограничение столбца XML Чтобы убедиться, что фамилия автора книги отличается от его имени, можно применить следующее ограничение CHECK: CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null CONSTRAINT CK_name CHECK (xCol.exist('/book/author[first-name = last-name]') = 0)) Кодировка текста SQL Server 2005 хранит данные XML в виде Unicode (UTF-16). Данные XML, полученные с сервера, приходят в кодировке UTF-16. Если Вы хотите другую кодировку, Вам нужно необходимую конвертацию после получения данных. Например, Вы можете преобразовать Ваши данные XML в тип varchar на сервере, в этом случае движок базы данных выдаст данные XML с кодировкой, определенной типом varchar. Хранение данных XML Вы можете передать значение XML для столбца, параметра или переменной XML несколькими способами. - Как символьный или двоичный тип SQL, который неявно конвертируется в тип XML. - Как содержимое файла. - Как результат механизма публикации XML - использование FOR XML с опцией TYPE, которая генерирует экземпляр данных XML. Переданное значение проверяется на структурированность. Если данные оказываются неструктурированными, то выдается соответствующее сообщение об ошибке. Для типизированного XML переданное значение проверяется на соответствие схемам XML, зарегистрированным в коллекции схем XML, сопоставленной столбцу XML. Экземпляр XML не вставляется в столбец, если он не проходит такую проверку. Более того, флажок DOCUMENT в типизированном XML ограничивает допустимые значения только документами XML, тогда как флажок CONTENT позволяет передавать и документ XML, и контент. Пример: вставка данных в нетипизированный столбец XML Следующая команда вставляет новую строку в таблицу docs со значением 1 для столбца pk и экземпляром <book> для столбца XML. Данные <book>, передаваемые в виде строки, неявно конвертируются в тип данных XML и проверяются на структурированность во время вставки. INSERT INTO docs VALUES (1, '<book genre="security" publicationdate="2002" ISBN="0-7356-1588-2"> <title>Writing Secure Code</title> <author> <first-name>Michael</first-name> <last-name>Howard</last-name> </author> <author> <first-name>David</first-name> <last-name>LeBlanc</last-name> </author> <price>39.99</price> </book>') Пример: вставка данных в нетипизированный столбец XML из файла Команда INSERT, показанная ниже, получает содержимое файла C:\temp\xmlfile.xml в виде BLOB, используя OPENROWSET. Новая строка вставляется в таблицу docs со значением 10 для первичного ключа и BLOB для столбца XML xCol. Проверка структурированности данных производится, когда содержимое файла назначается столбцу XML. INSERT INTO docs SELECT 10, xCol FROM (SELECT * FROM OPENROWSET (BULK 'C:\temp\xmlfile.xml', SINGLE_BLOB) AS xCol) AS R(xCol) Пример: вставка данных в типизированный столбец XML Типизированный столбец XML требует, чтобы данные экземпляра XML соответствовали пространству имен схем XML, используемых для типизации этого столбца (пространство имен может быть пустым). В показанном ниже примере это делается с помощью объявления пространства имен xmlns=http://myDVD. INSERT XmlCatalog VALUES(2, '<?xml version="1.0"?> <dvdstore xmlns="http://myDVD"> <dvd genre="Comedy" releasedate="2003"> <title>My Big Fat Greek Wedding</title> <price>19.99</price> </dvd> </dvdstore>') Пример: сохранение данных XML, сгенерированных с помощью FOR XML с опцией TYPE FOR XML была расширена опцией TYPE, чтобы генерировать результат в виде экземпляра типа данных XML. Результирующий XML может быть занесен в столбец, параметр или переменную XML. В следующей команде экземпляр XML, сгенерированный с помощью FOR XML TYPE, присваивается переменной @xVar типа XML. Значение переменной можно получить с помощью методов типа XML. DECLARE @xVar XML SET @xVar = (SELECT * FROM docs FOR XML AUTO,TYPE) Представление данных при хранении Экземпляры XML хранятся во внутреннем, двоичном представлении, которое оптимизировано для эффективного парсинга. Тэги конвертируются в значения типа integer, и конвертированные значения хранятся во внутреннем представлении. Это дает небольшую компрессию данных. Для нетипизированного XML значения узлов хранятся в строках Unicode (UTF-16), поэтому требуется конверсия типа во время работы. Например, чтобы оценить предикат /book/price > 9.99, значение цены книги конвертируется в тип decimal. С другой стороны, для типизированного XML значения имеют тип, определенный схемами XML. Это делает парсинг данных более эффективным и позволяет избежать конвертации типов во время работы. Двоичная форма хранения ограничена 2 гигабайтами на экземпляр XML, что достаточно для большинства данных XML. Также глубина иерархии XML ограничена 128 уровнями. Содержимое InfoSet данных XML защищено. Оно может не быть точной копией текста XML, т.к. следующая информация не сохраняется: не имеющие значения пустые места, порядок свойств, префиксы пространства имен, и объявление XML. Взгляд на моделирование данных Довольно часто набор реляционных столбцов и столбцов XML удобен для моделирования данных. Некоторые значения из ваших данных XML могут храниться в реляционных столбцах, а остальные, или все значения XML, хранятся в столбце XML. Это может дать лучшую производительность и лучшие характеристики блокировок. Значения из данных XML могут быть переданы в вычислимые столбцы в той же таблице (это должны быть свойства с одним значением). Свойство с множеством значений требует отдельной таблицы для свойства, которая должна заполняться с помощью триггеров. Глубина детализации данных XML, хранящихся в столбцах XML, критична для блокировок и обновления. SQL Server использует один и то же механизм блокировки для XML и не XML данных. Если глубина детализации велика, то блокировка больших экземпляров XML для обновления вызывает снижение производительности при одновременной работе множества пользователей. С другой стороны, из-за глубокой декомпозиции данных теряется инкапсуляция объектов и увеличиваются затраты на сборку. Выполнение запросов и модификация данных XML Выполнение запросов к экземплярам XML, хранимым в столбце XML, требует парсинга двоичных данных XML в столбце. Парсинг двоичных данных XML производится гораздо быстрее, чем парсинг текстовой формы данных XML. Индексирование XML позволяет избежать повторного парсинга. Более подробно индексирование рассматривается в главе "Индексирование данных XML". Методы типа XML Вы можете получать целые значения XML, если Вам это нужно, или можете получать части экземпляров XML. Это возможно с помощью четырех методов типа XML: query(), value(), exist() и nodes(), которые принимают в в виде аргумента выражение XQuery. Пятый метод, modify(), позволяет изменять данные XML и принимает в виде входного параметра команду изменения данных XML. Метод query() полезен для получения частей экземпляра XML. Выражение XQuery сравнивается со списком узлов XML. Поддерево, получаемое на каждом из этих узлов, возвращается в порядке документа. Тип результата - нетипизированный XML. Метод value() получает скалярное значение из экземпляра XML. Он возвращает значение узла, который соответствует выражению XQuery. Это значение конвертируется в тип T-SQL, определяемый вторым параметром метода value(). Метод exist() полезен для проверок существования в экземплярах XML. Он возвращает 1, если выражение XQuery соответствует непустому списку узлов, иначе он возвращает 0. Метод nodes() выдает экземпляры специального типа XML, каждый из которых имеет собственный контекст, относящийся к узлу, который соотвутствует выражению XQuery. Этот специальный тип XML поддерживает методы query(), value(), nodes() и exist(), и может быть использован в агрегатах count(*) и проверках на значение NULL. Все другие агрегаты и проверки вернут ошибку. Метод modify() позволяет изменять части экземпляра XML - добавлять или удалять поддеревья или изменять скалярные значения. Например, изменять цену на книгу с 9.99 на 39.99. Пример: использование метода query() Рассмотрим следующий запрос в столбце XML xCol таблицы docs, который получает все элементы <section> под элементом <doc> с id 123. Запрос также возвращает значение из столбца первичного ключа с типом integer. Метод query() в списке SELECT применяется для каждой строки в таблице, выдавая последовательность элементов <section>, которые возвращаются вместе со своими поддеревьями в порядке документов. Экземпляр XML без элемента <doc> с id 123 или без элемента <section> под ним результата не возвращает, т.е. метод query() возвращает NULL. SELECT pk, xCol.query('/doc[@id = 123]//section') FROM docs Возвращаемые значения NULL могут быть отфильтрованы во внешней команде SELECT. Также можно использовать метод exist(), как показано в следующем примере. Пример: использование метода exist() Рассмотрим следующий запрос, который использует методы query() и exist() в столбце XML xCol таблицы docs. Метод exist() использует выражение пути /doc[@id = 123], проверяя существование элемента верхнего уровня <doc> со свойством id, равным 123. Для каждой такой строки применяется метод query() из команды SELECT; в этом примере метод query() возращает последовательность всех элементов <section> под элементом <doc>. Любая строка, в которой метод exist() возвращает 0, опускается. SELECT xCol.query('/doc[@id = 123]//section') FROM docs WHERE xCol.exist ('/doc[@id = 123]') = 1 Пример: использование метода value() Следующий запрос получает заголовок третьей секции документа в виде строки Unicode, используя метод value(). Тип SQL nvarchar(max) результата определяется как второй параметр метода value(). Функция XQuery data() выделяет скалярное значение из узла <heading>. SELECT xCol.value( 'data((/doc//section[@num = 3]/heading)[1])', 'nvarchar(max)') FROM docs Язык XQuery Существует множество источников XML из документов Office, находящихся в файловой системе, web сервисов и файлов конфигурации. Фактически, данные все чаще создаются либо в формате XML, либо в виде виртуального документа XML. Чтобы справиться с этим растущим объемом данных, был придуман мощный язык запросов XQuery. XQuery описан в спецификации XQuery Language на сайте http://www.w3.org/TR/xquery как язык запросов, который эффективно использует структуру XML и может выражать запросы по всем типам данных, которые физически хранятся в виде XML или просматриваются как XML через средний уровень. Спецификация описывает язык запросов XQuery, который разработан для широкого применения для многих типов источников данных XML. XQuery разработан для удовлетворения требованиям XML Query 1.0 рабочей группы W3C XML Query и примерам XML Query Use Cases. Он разработан как язык, в котором запросы понятны и кратки. Он также достаточно гибок для выполнения запросов широкого спектра источников данных XML, включая базы данных и документы. XQuery можно обобщить следующим утверждением: язык XQuery относится к XML так же, как язык SQL к реляционным базам данных. Подмножество XQuery, встроенное в T-SQL - это язык для выполнения запросов на типе XML. В настоящее время язык еще разрабатывается Worldwide Web Consortium (W3C) с участием всех главных поставщиков баз данных, включая Microsoft. Наша версия соответствует релизу от ноября 2003 года. XQuery включает XPath 2.0 как язык навигации. Реализация XQuery в SQL Server 2005 имеет конструкции для движения по узлам (for), проверки узлов (where), возврата значений (return) и сортировки (order by). Также есть возможность изменения данных во время выполнения запросов. SQL Server 2005 также имеет языковые конструкции для изменения данных (DML) типа XML (для дополнительной информации см. главу "Изменение данных" ниже). Следующий пример показывает, как использовать XQuery для данных типа XML. Пример: использование богатых языковых конструкций в XQuery Следующий запрос показывает несколько языковых конструкций XQuery, используемых вместе. Он возвращает заголовок, обрамленный в новый тэг <topic> с секциями номер 3 и далее из документа с id 123. SELECT pk, xCol.query(' for $s in /doc[@id = 123]//section where $s/@num >= 3 return <topic>{data($s/heading)}</topic>') FROM docs Оператор "for" указывает на то, что нужно двигаться по всем элементам <section> под элементами <doc> с id 123 и привязывать каждый такой элемент <section> к переменной $s. Оператор "where" используется для того, чтобы номер секции (атрибут @num элемента <section>) равен или больше 3. Запрос возвращает значение секции <heading> по порядку документа, обрамленное элементом конструкции <topic>. ПРОДОЛЖЕНИЕ СЛЕДУЕТ Статьи на русском языке
Разработка бездефектного программного обеспечения
SQL: Cumulative sum across the row, not down the column Самые популярные темы недели
Tool Вы знаете что твориться на ваших 10-30+ серверах ?
Reporting Service: Ориентация отчета при экспорте ADO.NET Сборник рецептов. Для профессионалов
|
#226<< #227 |
Вопросы, предложения, коментарии, замечания, критику и т.п. оставляйте Виталию Степаненко и Александру Гладченко в форуме: Обсуждение рассылки
|
http://subscribe.ru/
http://subscribe.ru/feedback/ |
Подписан адрес: Код этой рассылки: comp.soft.winsoft.sqlhelpyouself |
Отписаться |
В избранное | ||