|
Программирование >> Программирование баз данных
в случае необходимости автоматически осуществляется приведение типа, но обычно это влечет за собой получение предсказуемых результатов. Параметр <Column XPath> обозначает шаблон XPath (заданный относительно узла, указанного в качестве начальной точки для функции OPENXML). Шаблон XPath позволяет получить доступ к узлу, данные которого требуются для формирования столбца. Должен ли при этом использоваться элемент или атрибут, зависит от описанного выше параметра с обозначением флажков отображения. Если параметр <Column XPath> не задан, то СУБД SQL Server действует на основании предположения, что должны быть получены данные текущего узла, согласно определению начальной точки для оператора вызова функции OPENXML. Параметр <MetaProperty> задает множество специальных переменных (метасвойств), на которые можно ссылаться в запросах OPENXML. Эти переменные определяют различные аспекты применения той или иной части модели DOM документа XML, которые интересуют пользователя. Чтобы ввести в действие указанные переменные, достаточно заключить их в одинарные кавычки и поместить в соответствующее место в значении параметра <Column XPath>. Перечень доступных метасвойств приведен ниже. □ @тр: id. Переменную @тр: id не следует путать с директивой id, применяемой в сочетании с конструкцией FOR XML, которая рассматривалась при описании опции EXPLICIT. Дело в том, что свойство @тр: id имеет аналогичное назначение, но представляет собой уникальный идентификатор узла DOM (в области определения документа). Еще одной отличительной особенностью свойства @тр: id является то, что его значение формируется системой, поэтому при его использовании можно быть уверенным, что требуемое значение уже задано. Кроме того, гарантируется, что данное свойство продолжает хранить ссылку на один и тот же узел модели DOM документа XML до тех пор, пока этот документ остается в памяти. Если значение переменной @тр: id равно нулю, то узел, к которому она относится, представляет собой корневой узел (свойство @тр: parent id этого узла, о котором речь пойдет ниже, имеет NULL-значение). □ @тр: parent id. Это свойство соответствует описанному выше свойству @тр: id, но относится только к родительскому узлу. □ @тр: local name. Свойство @mp: local name определяет часть полностью уточненного имени узла, соответствующую локальному имени. Это свойство используется в сочетании с префиксом и универсальным идентификатором ресурса (Uniform Resource Identifier - URI) пространства имен (обычно идентификатор URI пространства имен начинается с префикса URN) для составления имен узлов элементов или узлов атрибутов. □ @тр: parentlocalname. Это свойство соответствует описанному выше свойству @тр: localname, но относится только к родительскому узлу. □ @тр inamespaceuri. Свойство @тр: namespaceuri позволяет определить идентификатор URI пространства имен текущего элемента. Если это свойство имеет NULL-значение, то пространство имен не определено. □ @тр iparentnamespacerui. Это свойство соответствует описанному выше свойству @тр: namespaceuri, но относится только к родительскому узлу. □ @тр:prefix. Свойство @mp:prefix содержит префикс пространства имен для имени текущего элемента. □ @тр iparentpref ix. Это свойство соответствует описанному выше свойству @тр: prefix, но относится только к родительскому узлу. □ @тр: prev. Свойство @тр: prev содержит значение свойства @тр: id предьщущего узла, сестринского по отношению к текущему узлу. С помощью этого свойства можно получить информацию об упорядочении элементов на текущем уровне иерархии. Например, если значение свойства @тр :prev составляет NULL, то рассматриваемый узел является первым по порядку узлом на данном уровне дерева. □ @тр: xmltext. Метасвойство @тр: xmltext используется для обработки данных и содержит действительный код XML текущего элемента. Безусловно, разработчик всегда имеет возможность избавиться от огромного объема работы, постаравшись обойтись без использования всех указанных параметров. Этой цели можно достичь, подготовив таблицу, которая устанавливает непосредственную связь (определяемую по именам и типам данных) с начальной точкой XPath, заданной в функции OPENXML. Подготовив такую таблицу, следует указать ее имя, после чего все необходимые преобразования будут выполнены в СУБД SQL Server автоматически! Таким образом, действия по подготовке документа XML являются достаточно трудоемкими, но на этом работа не заканчивается. Дело в том, что после завершения подготовки документа XML необходимо вызвать процедуру sp xml removedocument, чтобы освободить память, в которой хранился документ XML. Но, к счастью, оператор вызова этой процедуры имеет очень простой синтаксис: sp xml removedocument [hdoc = ]<handle of XML doo Следует еще раз подчеркнуть, что для обеспечения бесперебойного функционирования приложения необходимо всегда стремиться своевременно удалять ненужные объекты. Безусловно, удаление многих объектов, ставших ненужными, происходит автоматически. В частности, функции своевременного освобождения ресурсов осуществляются и в СУБД SQL Server, но не следует рассчитывать на то, что СУБД сможет автоматически освободить все ресурсы. Например, СУБД SQL Seruer удаляет из оперативной памяти ненужные объекты посяе заверисения соединения, но если используется пул соединений, то выполнение такой операции становится затруднительным. А если система постоянно работает в условиях высокой нагрузки, то некоторые неиспользуемые соединения могут продолжать занимать отведенные им ресурсы. Но для разработчика совсем несложно предусмотреть своевременный вызов хранимой процедуры для освобождения ресурсов, поэтому рекомендуется обязательно удалять все ненужные объекты. Итак, мы в основном рассмотрели все, что необходимо для решения реальной задачи, поэтому приступим к изучению достаточно сложного примера. Допустим, что происходит слияние двух компаний, поэтому часть данных одной из компаний необходимо передать в базу данных другой компании. Предположим, что необходимо импортировать данные о некоторых поставщиках, информация о которых отсутствует в базе данных AdventureWorks. Ниже приведен сценарий, который может служить образцом того, как данные импортируются из документа XML. USE AdventureWorks DECLARE @idoc int DECLARE @xmldoc nvarchar(4000) -- Определить документ XML SET @xmldoc = <ROOT> <Shipper CorTpanyName= Billy Bob's Pretty Good Shipping Base= 4.50 Rate= l.05 /> <Shipper CompanyName= Fred's Freight Base= 3.95 Rate= l.29 /> </ROOT> PRINT ©xmldoc -- Загрузить докент XML и выполнить его синтаксический анализ -- в оперативной памяти EXEC sp xmljpreparedocument @idoc OUTPUT, ©xmldoc -- Рассмотрим, как выглядит таблица Shippers до вставки SELECT * FROM Purchasing.ShipMethod -- Рассмотрим данные XML в табличном формате SELECT * FROM OPENXML (©idoc, /ROOT/Shipper , 0) WITH ( CompanyName nvarchar(40), Base decimal(5,2), Rate decimal(5,2)) -- Выполнение вставки с учетом имеющихся данных INSERT INTO Purchasing.ShipMethod (Name, ShipBase, ShipRate) SELECT * FROM OPENXML (©idoc, /ROOT/Shipper, 0) WITH ( CompanyName nvarchar(40), Base decimal(5,2), Rate decimal(5,2)) -- A теперь рассмотрим, как выглядит таблица Shippers после вставки SELECT * FROM Purchasing.ShipMethod -- После этого можно удалить документ XML из памяти EXEC sp xml removedocument ©idoc Полученный при этом результат отвечает предъявленным требованиям: ShipMethodID Name ShipBase ShipRate 1 XRQ - TRUCK GROUND 3.95 0.99 2 ZY - EXPRESS 9.95 1.99 3 OVERSEAS - DELUXE 29.95 2.99 4 OVERNIGHT J-FAST 21.95 1.2 9 5 CARGO TRANSPORT 5 8.99 1.49 6 Billy Bobs Pretty Good Shipping 4.50 1.05 7 Freds Freight 3.95 1.29 Эти данные внешне не очень привлекательны, но соответствуют предъявленным требованиям и показывают, что нам удалось успешно преобразовать код XML в реляционные данные.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |