Программирование >>  Программирование баз данных 

1 ... 198 199 200 [ 201 ] 202 203 204 ... 346


другие функции для работы с наборами строк (такие как OPENQUERY и OPENROWSET). Это означает, что документ XML можно использовать в операции соединения или даже сделать его источником входных данных, применив операцию INSERT. . . SELECT или SELECT INTO. При этом основное различие между OPENXML и другими функциями состоит в том, что в сочетании с этой функцией необходимо использовать целый ряд системных хранимых процедур для подготовки документа, а затем для очистки памяти после завершения обработки документа.

Для подготовки документа используется системная хранимая процедура sp xml preparedocument. Эта процедура перемещает строковое представление документа XML в память, а затем осуществляет его предварительную интерпретацию для достижения оптимальной производительности запроса. Документ XML остается в памяти до тех пор, пока пользователь явно не укажет, что требуется удалить этот документ, или пока не завершится использование соединения, с помощью которого была вызвана процедура sp xml preparedocument.

Но необходимо отметишь, что не следует рассчитывать лишь на то, что удаление из оперативной памяти объектов, которые стали больиле не нужными, будет выполнено автоматически операционной системой. Обязанности по своевременному удалению из памяти ненужных экземпляров объектов возложены на тех, кто создал эти экземпляры объектов (к сожалению, при подготовке программистов на эту сферу деятельности об ращают мало внимания).

Безусловно, в языке Visual Basic, С# и большинстве других языков программирования предполагается, что удаление экземпляров объектов из памяти и освобождение памяти происходит после тюго, как эти экземпляры выходят из области определения, и применение аналогичного принципа удаления документюв, работа с которыми закончена, подразумевается по отношению к СУБД SQL Seruer. Но не следует пытаться уменьшить для себя объем работы, раесчитывая на указанные средства освобождения памяти. Примите обязанности пю удалению из памяти ненужных документюв на себя! Явно освобождая память (с июпользованием системной хранимой процедуры sp xml removedocument), можно достичь полной уверенности в том, что удаление документа действительно происходит, немного ускорить процесс освобождения памяти, а также явно показать в прикладном коде, что работа с документом окончена.

Вызов системной хранимой процедуры sp xml preparedocument имеет следующий простой синтаксис:

sp xml j)reparedocument @hdoc = <integer variable> OUTPUT, [, ©xmltext = <xml>]

[, ©xpath namespaces = <url to a namespace>]

При использовании URL пространства имен необходимо заключить этот URL с обеих сторон в символы < и > (например, <root xmlns : sql = гш1: sche-mas-microsof t-com:xml-sql> ).

Параметры этой хранимой процедуры, как описано ниже, в основном не требуют пояснений.

@hdoc. Программисты, которым приходилось использовать в своей работе API-интерфейс Windows (или какие-то другие системы программирования, но



приведенный пример является наиболее характерным), по-видимому, знают, какой смысл имеет префикс h ; он представляет собой обозначение дескриптора в венгерской записи. Дескриптор по существу представляет собой указатель на блок памяти, в котором хранятся некоторые данные (причем фактически разнообразие представленных в этом блоке данных почти неограниченно). В данном сл)чае параметр @hdoc представляет собой дескриптор документа XML, который передается в СУБД SQL Server для последующего синтаксического анализа и сохранения. Это - выходная переменная, а это означает, что переменная, на которую здесь задана ссылка, после возврата управления из хранимой процедуры будут содержать дескриптор документа XML. Такие данные следует обязательно сохранить, поскольку они потребуются для дальнейшей работы с функцией OPENXML.

©xmltext. Назначение этого параметра соответствует его имени - он указывает на действительный текст XML, который должен быть подвергнут синтаксическому анализу и предназначен для использования в дальнейшей работе.

@xpath namespaces. Ссылка (ссылки) на пространство имен, которая требуется для обеспечения правильной обработки кода XML.

После вызова этой хранимой процедуры и сохранения дескриптора документа можно приступить к использованию функции OPENXML. Синтаксис вызова указанной функции является немного более сложным:

OPENXML(<handle>,

<XPath to base node>

[, <mapping flags>]) [WITH (<schema Declaration><table Name>)]

Выше в данной главе уже было посвящено несколько слов описанию параметров, содержащих значение дескриптора, таких как <handle>; вообще говоря, дескриптор представляет собой целочисленное значение, которое должно быть получено в виде выходного параметра после вызова процедуры sp xml preparedocument.

При вызове функции OPENXML должен быть задан параметр <XPath to base node>, представляющий собой обозначение пути к узлу, который должен служить в качестве начальной точки для всех запросов. С другой стороны, параметр <Schema Declaration> позволяет ссылаться на любые части документа XML с помощью указания пути перемещения относительно базового узла, заданного в этом параметре.

Следующим параметром функции OPENXML являются флажки отображения, <mapping flags>, позволяющие указать, должно ли быть в результатах вызова функции OPENXML отдано предпочтение элементам или атрибутам. Возможные значения флажков отображения и их описания приведены в табл. 16.5.

Таблица 16.5. Флажки отображения функции openxml Значение байта Описание

О Это значение, как и описанное ниже значение 1, позволяет указать, что

должны использоваться только атрибуты. Но в отличие от 1, данное значение не может применяться в сочетании с 2 или 8 (поскольку, например, 0 + 2 = 2). Значение О задано по умолчанию



Окончание табл. 16.5

Значение байта Описание

1 Если это значение не задано в сочетании с описанным ниже значением 2, то используются только атрибуты. Если атрибут с указанным именем отсутствует, то возвращается NULL-значение. Значение 1 может также применяться в сумме со значением 2 или 8 (или с обоими этими значениями) в целях осуществления действий, предусмотренных всеми заданными опциями, но в первую очередь выполняется действие, предусмотренное значением 1. Если с помощью конструкции XPath обнаруживаются и атрибут, и элемент с одинаковыми именами, то предпочтение отдается атрибуту

2 Если это значение не задано в сочетании со значением 1 (описанным выше), то используются только элементы. Если элемент с указанным именем отсутствует, то возвращается NULL-значение. Значение 2 может также применяться в сумме со значением 1 или 8 (или с обоими этими значениями) для осуществления действий, предусмотренных всеми заданными опциями. Если это значение применяется в сочетании со значением 1, то будет осуществляться отображение атрибута, если таковой существует. Если атрибут не существует, то используется элемент. Если не существует

и элемент, то возвращается NULL-значение

8 Может применяться в сочетании со значениями 1 или 2 (как описано выше).

Потребляемые данные нельзя скопировать в свойство переполнения @тр: xmltext (поскольку для выборки данных пришлось бы использовать элемент схемы метасвойства). Эту опцию рекомендуется применять, если не должны использоваться метасвойства (и чаще всего следует руководствоваться именно таким подходом). В результате отказа от использования метасвойств издержки выполнения операций немного уменьшаются (пусть даже очень немного)

Наконец, должна быть указана схема или таблица. Для тех, кто не знаком с языком XPath, задача определения схемы может оказаться довольно трудоемкой. Но, к счастью, применяемые при этом конструкции XPath не слишком сложные, поэтому процедура составления схемы может быть довольно быстро доведена буквально до автоматизма (используемые при этом конструкции во многом напоминают определения каталогов в файловой системе Windows, но предоставляют гораздо больше возможностей).

Сама схема может немного изменяться в зависимости от способа ее объявления. В качестве объявления схемы применяется такое определение (описание этого определения приведено ниже):

WITH (

<column name> <data type> [{<column XPath><metaproperty>}] [,<column name> <data type> [{<column XPath><metaproperty>}]

Параметр с обозначением имени столбца, <Column Name>, полностью соответствует своему названию- он представляет собой имя атрибута или элемента, применяемого для выборки данных. Этот параметр служит также в качестве имени, на которое можно сослаться при формировании списка выборки, выполнении операции соединения и т.д.

Параметр с обозначением типа данных, <data type>, представляет собой любой допустимый тип данных SQL Server. Поскольку в документе XML могут быть заданы типы данных, не имеющие эквивалентов в СУБД SQL Server,



1 ... 198 199 200 [ 201 ] 202 203 204 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика