Опубликован: 29.07.2008 | Доступ: свободный | Студентов: 1879 / 489 | Оценка: 4.31 / 4.13 | Длительность: 09:00:00
Лекция 1:

Какие именно данные приложения следует хранить в базе данных

Лекция 1: 123 || Лекция 2 >

Использование типа данных XML

В SQL Server 2005 появляется полнофункциональный тип данных XML. Благодаря этому типу данных становится возможным использовать свойственные XML SQL-запросы для поиска XML-данных и доступа к ним. Этот тип данных доступен и для таблиц, и для переменных. Если вы храните данные с использованием типа данных XML, то для запроса к ним можно использовать реализацию языка запросов XQuery в SQL Server. До появления типа данных XML при необходимости выполнить запрос к этим данным проектировщикам приходилось сначала извлекать их в реляционную версию. Необходимость извлечения XML-данных в таблицы и столбцы (эта методика получила название разбивки данных) с целью получения возможности запрашивать эти данные ограничивала гибкость, присущую XML-документам. Теперь, благодаря возможности использовать тип данных XML, разработчики могут ссылаться на содержимое документа, не прибегая к его разбивке на строки и столбцы. В табл. 1.3 перечислены поддерживаемые в SQL Server 2005 методы манипуляций с типом данных XML.

Таблица 1.3. Методы языка XQuery, поддерживаемые в SQL Server 2005
Метод Синтаксис Назначение
query() .query(выражение XQuery) Выполняет выборку данных в XML-документе или фрагменте аналогично оператору SELECT.
value() .value (выражение XQuery, тип данных SQL) Объединяет функциональность метода query() с функцией CONVERT языка SQL. Это позволяет выполнить выборку значения из XML-документа или фрагмента и конвертировать результат в определенный тип данных.
exist() .exist (выражение XQuery) Возвращает значение TRUE, если искомое выражение обнаружено в XML-документе; метод аналогичен оператору EXISTS в T-SQL.
modify() .modify (выражение XML-DML) Позволяет добавлять, обновлять или удалять узлы в документе XML. Метод modify() следует использовать в предложении оператора UPDATE T-SQL
nodes() .nodes(выражение XQuery) as ИмяТаблицы(ИмяПоля) (См. информацию о XML-DML на справочном ресурсе SQL Server Books Online.) Позволяет выполнить разбивку документа и разместить результаты в реляционном формате

В следующем примере демонстрируется, как можно выполнить запрос к XML-данным в переменных XML.

Применяем метод Query() языка XQuery

  1. В меню Start (Пуск) выберите All Programs, Microsoft SQL Server 2005, SQL Server Management Studio (Все программы, Microsoft SQL Server 2005, Среда SQL Server Management Studio).
  2. В окне Microsoft SQL Server Management Studio создайте новый запрос, нажав кнопку New Query (Создать запрос). (Готовый запрос можно найти в файлах примеров под именем XQueryQueryMethod.sql ).
  3. Объявите переменную с типом данных XML, введя в панель запросов следующий код:
    DECLARE @SampleXML XML
  4. Запишите в переменную выражение XML, добавив в панель запросов следующий код:
    SET @SampleXML = '<root>
    <L1>
      <L2>Это первая строка</L2> 
    </L1> 
    <L1>
      <L2>Это вторая строка</L2> 
    </L1> </root>'
  5. Чтобы извлечь значения из узла L2, воспользуйтесь методом query(). Введите в панель запроса следующий код:
    SELECT @SampleXML.query('/root/L1/L2')
  6. Выполните запрос, нажав кнопку Execute (Выполнить) на панели инструментов или функциональную клавишу F5. В панели результатов будут отображены следующие результаты:
    <L2> Это первая строка</L2>
    <L2> Это вторая строка</L2>

    Даже этот простой пример может дать некоторое представление о том, что можно сделать с помощью новых функций XQuery в SQL Server. Можно использовать метод data(), чтобы возвратить данные из элемента без тэгов XML, или метод exist(), чтобы проверить, существует ли определенный узел.

    Следующий код (который можно найти в файлах примеров под именем XQueryQueryDataMethod.sql ) демонстрирует пример использования метода data() для возвращения определенного фрагмента XML-данных, не заключенных в тэги XML:

    DECLARE @SampleXML XML SET @SampleXML = 
    '<root>
      <L1>
        <L2>Это первая строка</L2>
      </L1>
      <L1>
        <L2>Это вторая строка</L2>
      </L1> 
      </root>'
    SELECT @SampleXML.query("data(/root/L1/L2 = "Это вторая строка"])")

    Должен получиться результат "Это вторая строка".

    Следующий код (его можно найти в файлах примеров под именем XQueryQueryExistMethod.sql ) демонстрирует пример использования метода exist() для того, чтобы определить, представлен ли в узле определенный фрагмент XML-данных:

    DECLARE @SampleXML XML, @Exists bit
    SET @SampleXML = 
    '<root>
      <L1>
        <L2>Это первая строка</L2>
      </L1>
      <L1>
        <L2>Это вторая строка</L2>
      </L1> 
     </root>'
     
    SET @Exists = @SampleXML.exist("/root/L1/L2[text() =
                        "Это первая строка"]") 
    SELECT @Exists

    Результирующий набор будет содержать значение 1.

    Одно из преимуществ использования переменных XML заключается в том, что можно классифицировать столбец с другим типом данных, например, TEXT или VARCHAR, как XML, а затем применить методы XQuery к данным в этом столбце. Если вы используете XML в уже имеющейся среде SQL Server 2000, то, всего вероятнее, данные хранятся в полях TEXT или VARCHAR. В среде SQL Server Management Studio можно просмотреть данные в XML-формате. Это было невозможно в модуле Query Analyzer, который возвращал данные в виде нескольких строк. Следующий пример кода показывает, как классифицировать текстовые данные как XML.

    SELECT CAST(textdata AS XML) 
      FROM dbo.SomeTable 
      WHERE SomeColumnID = 1

    На рис. 1.1 показаны результаты запроса, который возвращает XML-данные, отображаемые в виде строки, в SQL Server Management Studio.

    Результаты запроса XQuery, отображаемые в SQL Server Management Studiio в виде строки

    Рис. 1.1. Результаты запроса XQuery, отображаемые в SQL Server Management Studiio в виде строки

    Если щелкнуть ссылку в панели результатов, как показано на рис. 1.1, то вы увидите результат, отображенный в виде XML, как показано на рис. 1.2.

    Так выглядит результат запроса, отображаемый в SQL Server Management Studio в виде XML после перехода по ссылке в панели результатов

    увеличить изображение
    Рис. 1.2. Так выглядит результат запроса, отображаемый в SQL Server Management Studio в виде XML после перехода по ссылке в панели результатов

Типизированный или нетипизированный XML?

SQL Server 2005 поддерживает использование XML-схем с типом данных XML. На рис. 1.3 показано размещение коллекции схем в SQL Server Management Studio. Если вы используете схемы, или коллекции схем, как они называются в SQL Server, то SQL Server применяет схему к XML-данным, хранимым в таблице. При применении схемы принудительно применяются типы данных и ограничения посредством выполнения синтаксического анализа на основе схемы, которая загружается в столбец с типом данных XML. Можно гарантировать форматирование XML-данных, используя типизированные столбцы XML.

Размещение коллекции схем в SQL Server Management Studio

Рис. 1.3. Размещение коллекции схем в SQL Server Management Studio

Если вы храните XML-данные как нетипизированные, то есть, не применяя схему непосредственно к данным, тип данных все равно будет XML, и с этими данными можно использовать функции XML. В любом случае, целый ряд операторов и функций T-SQL доступен как для типизированных, так и для нетипизированных столбцов.

Вероятно, вы уже оценили преимущества использования типа данных XML. В новых приложениях, которые требуют использования XML, вам, безусловно, придется использовать тип данных XML. Однако если вы обновляете механизм базы данных для уже имеющейся системы, решение может оказаться непростым. Например, если существующая программа работает с XML-данными, размещенными в столбцах TEXT или NTEXT, возможно, в ваших же интересах будет оставить все как есть. Если только переключение на тип данных XML не обеспечивает безусловно необходимой вам функциональности, лучше используйте тип данных XML для новых разработок или при будущей модернизации отдельного приложения.

Предупреждение. При обновлении ядра базы данных лучше всего выполнять это обновление изолированно, не выполняя одновременно крупных обновлений приложения. Хотя тип данных XML - это замечательная новая возможность, объем ресурсов на разработку и тестирование, который требуется для реализации значительных изменений приложения, может помешать бесперебойной модернизации ядра базы данных, если вы попытаетесь модернизировать их одновременно.
Лекция 1: 123 || Лекция 2 >
Марат Уздемиров
Марат Уздемиров
Ярослав Малащенко
Ярослав Малащенко