ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Використання XML спільно з SQL
         

     

    Інформатика, програмування

    Використання XML спільно з SQL

    XML і сучасні бази даних

    Олексій Ширшов

    Вступ

    Цей матеріал присвячений тим нововведенням, які з'явилися в SQL і технології доступу до баз даних завдяки XML. Стаття описує базові механізми і можливості використання XML в MS SQL Server та ADO. Стаття не претендує на фундаментальні дослідження в цій області, так як XML і SQL Server речі по природі своїй неосяжні. Крім того, рівень підтримки XML в SQL Server постійно збільшується, і за всіма змінами надзвичайно важко встежити. Наприклад, після виходу SQLXML 3.0, стало можливим використовувати SQL Server в якості сервера Web-служб. На жаль, ця тема в статті не висвітлюється, але в майбутньому, можливо, знайдеться час і для неї.

    Своєю появою стаття зобов'язана того безладу, який був в голові у автора з даного питання.

    Підтримка XML в Microsoft SQL Server 2000

    Microsoft SQL Server 2000 містить вбудовані засоби для роботи з XML. Результуючу вибірку можна представляти у форматі XML з допомогою ключових слів for xml оператора select, а також зробити запит з документа XML з допомогою оператора OPENXML.

    FOR XML

    Цей оператор призначений для представлення результуючого набору рядків у вигляді XML-документа. Розглянемо його синтаксис:        

    [FOR (BROWSE | XML (RAW | AUTO | EXPLICIT)   

    [, XMLDATA]   

    [, ELEMENTS]   

    [, BINARY BASE64]   

    )   

    ]     

    Призначення ключового слова BROWSE не відноситься до теми нашої статті.

    FOR XML RAW - Кожен рядок представляється у вигляді елемента . Назва поля формує назва атрибута, а значення поля - значення атрибута.

    FOR XML AUTO - Документ XML форматується точно так само, як і при XML RAW, тільки назва елемента, що представляє рядок, замінюється на назву таблиці.

    FOR XML EXPLICIT - Самий складний і гнучкий варіант для створення XML-документів. У цьому режимі можна формувати документи практично будь-якої форми, однак для цього сам запит повинен бути написаний за певними правилами. Більш докладно вони розглядаються нижче.

    XMLDATA - Іноді буває корисно отримати не тільки самі дані, але і їх схему. Схема даних також записується у форматі XML. Вона визначає типи елементів і атрибутів, накладає обмеження на їх значення, і взагалі являє метаінформації, що дозволяє перевірити документ на дійсність (validity). Існує кілька різновидів (форматів) схем даних. SQL Server використовує XDR-схеми (XML Data Reduced). Докладну документацію по XDR можна знайти в [1]. Ключове слово XMLDATA може бути використано для всіх трьох режимів формування XML-документа (raw, auto і explicit).

    ELEMENTS - Ключове слово, що використовується тільки спільно з FOR XML AUTO. При його вказівці поля формуються як елементи: назва поля відповідає назві елементу, а значення поля - значенням елементу.

    BINARY BASE64 - Визначає, як будуть виведені двійкові дані (binary data).        

    ПОПЕРЕДЖЕННЯ   

    SQL Server не дозволяє використовувати   предикат GROUP BY спільно з FOR XML AUTO.     

    Приклади

    Для простоти і зручності будемо використовувати стандартну базу даних PUBS з поставки SQL Server 2000. Треба сказати, що Query Analyzer - Не кращий засіб для перегляду XML-документів, тому що результат він поміщає в одну клітинку, як текстове поле (або в один рядок, обрізаючи текст, при виведенні результату у вигляді тексту). Тому, якщо ви хочете випробувати всі приклади самі, зверніться до розділу IIS і XML-функції SQL Server.

    Почнемо з розгляду FOR XML RAW:        

    select   au_fname, au_lname, address   

    from authors   

    where au_fname like 'M%'   

    for   xml raw     

    Цей запит повертає імена всіх авторів, що починаються на літеру M. Ось результати в форматі XML:        

      

      

      

      

        

    Тепер замінимо xml raw на xml auto:        

      

      

      

      

        

    Як бачите, зміни невеликі. Замість назви у вікні "row» підставляється ім'я таблиці. Тепер додамо до цього запиту ключове слово ELEMENTS.        

    select   au_fname, au_lname, address   

    from authors   

    where au_fname like 'M%'   

    for   xml auto, elements     

    Ось результати:        

      

    Marjorie   

    Green   

    309 63rd St.   # 411   

      

      

    Michael   

    O'Leary   

    22 Cleveland Av.   # 14   

      

      

    Meander      

    Smith   

    10 Mississippi   Dr.   

      

      

    Morningstar      

    Greene   

    22 Graybar House   Rd.   

      

      

    Michel   

    DeFrance   

    3 Balding   Pl.   

        

    Документ вийшов більш громіздким: всі поля представлені елементами.

    За допомогою ключового слова XMLDATA можна отримати документ зі схемою даних.        

    select   au_fname, au_lname, address   

    from authors   

    where au_fname like 'M%'   

    for   xml auto, xmldata     

    Цей запит поверне такий документ:        

      

    xmlns: dt = "urn: schemas-microsoft-com: datatypes">   

      

      

      

      

      

      

      

      

      

      

    au_fname = "Marjorie"   au_lname = "Green" address = "309 63rd St. # 411" />   

      

    au_fname = "Michael"   au_lname = "O'Leary" address = "22 Cleveland Av. # 14" />   

      

    au_fname = "Meander"   au_lname = "Smith" address = "10 Mississippi Dr." />   

      

    au_fname = "Morningstar"   au_lname = "Greene" address = "22 Graybar House Rd." />   

      

    au_fname = "Michel"   au_lname = "DeFrance" address = "3 Balding Pl." />     

    Як бачите, тепер документу передує ХDR-схема, що дозволяє перевірити правильність його вмісту.

    FOR XML EXPLICIT

    В даному режимі можна формувати практично будь-які документи; структура результуючого XML-документа визначається безпосередньо в самому запиті. Запит може приймати дуже складний вид, нижче будуть розглянуті правила, за якими він складається.

    Перше поле завжди називається tag і являє собою числовий ідентифікатор таблиці. Ви можете вказувати для нього будь-які числові значення. У результуючому документі він не з'являється, і потрібен тільки, щоб визначити зв'язки між таблицями для формування ієрархічного документа. Друге поле називається parent і теж може представляти будь-який числовий ідентифікатор. Він визначає батьківську таблицю для даної таблиці і в результуючому документі також не ходить. Якщо батьки відсутня, вказується 0 або NULL. Для ієрархічних вибірок потрібно використовувати кілька запитів, об'єднаних за допомогою оператора UNION ALL.

    Після двох обов'язкових полів tag і parent слідують поля, які потрібно вибрати з таблиці. Для них повинен бути заданий псевдонім, визначає тип XML-вузла, його назва та іншу інформацію. Ось синтаксис цього псевдоніма:        

    ElementName! TagNumber! AttributeName! Directive     

    Розглянемо призначення кожної з частин цього псевдонім:

    ElementName - ім'я елемента, в якому знаходиться елемент даного поля. Зазвичай тут вказується ім'я таблиці.

    TagNumber - ідентифікатор таблиці, в якій знаходиться на цьому полі. Одному і тому ж ElementName завжди повинен відповідати один TagNumber. Він також не відображається ні в якому вигляді в результуючому документі, однак потрібен для визначення ієрархічних зв'язків між таблицями.

    AttributeName - ім'я атрибута (або елемента), представляє на цьому полі.

    Directive - по суті, являє собою тип вузла. Може приймати такі значення:        

    element         

    поле представляється у вигляді   елемента             

    xml         

    Те ж саме, що element,   але не виконує трансформації тексту. Наприклад, символ менше (<) не   перетворюється на посилання <             

    cdata         

    значення поля обрамляється   відповідним чином. Назва атрибуту вказувати разом із цим ключовим   словом не можна.             

    hide         

    дозволяє приховати поле             

    id, idref, idrefs         

    дозволяють робити посилання на   інші елементи. Ці атрибути мають значення, тільки якщо створюється схема   даних.     

    Розглянемо невеликий приклад. На самому початку ми розглядали запит з використанням FOR XML RAW:        

    select   au_fname, au_lname, address from authors where au_fname like 'M%' for xml raw     

    Перепишемо його з використанням FOR XML EXPLICIT:        

    select   1 as tag,   

    0 as parent,   

    au_fname as 'authors! 1! fname',   

    au_lname as 'authors! 1! lname',   

    address as 'authors! 1! address'   

    from authors where au_fname like 'M%'   

    for   xml explicit     

    Результат буде точно таким же. Трохи виправимо запит для демонстрації можливостей директиви FOR XML EXPLICIT.        

    select   1 as tag,   

    0 as   parent,   

    au_fname as 'authors! 1! fname',   

    au_lname as 'authors! 1! lname! element',   

    address as 'authors! 1!! cdata'   

    from authors where au_fname like 'M%'   

    for   xml explicit     

    Ось результат:        

      

    Marjorie   

      

      

      

    Michael   

      

      

      

    Meander   

      

      

      

    Morningstar   

      

      

      

    Michel   

      

        

    Непогано для одного запиту! Оскільки для поля au_lname вказаний атрибут element, вона подана у вигляді елементу. Адреса знаходиться в секції CDATA.

    Тепер розглянемо, як формувати ієрархічні документи. Візьмемо такий запит:        

    select   pub_name, city, fname, lname   

    from publishers as p   

    join employee as e on p.pub_id = e.pub_id   

    where pub_name like 'Binnet%' or pub_name   like 'New Moon%'   

    order by pub_name, city, fname, lname     

    Він повертає імена всіх службовців видавництв Binnet & Hardley і New Moon Books. Результат запиту (20 записів) я наводити не буду, зазначу лише, що він містить велику кількість повторюваних назв видавництв, тому що результат представлений в реляційної формі. Ми ж хочемо отримати наступне:        

      

      

      

      

      

      

      

      

      

      

      

      

      

      

      

      

      

      

      

      

      

      

      

        

    І як, запитаєте ви? Приблизно так:        

    select 1 as tag, - перший підзапит   

    0 as parent,   

    pub_name as 'pubs! 1! PubName',   

    city as 'pubs! 1! City',   

    NULL as   'employee! 2! First_Name',   

    NULL as 'employee! 2! Last_Name'   

    from publishers as pubs   

    where pub_name like 'Binnet%'   or pub_name like 'New Moon%'   

    union all select 2 as tag, - друга підзапит   

    1 as parent,   

    pubs.pub_name,   

    pubs.city,   

    fname,   

    lname   

    from employee as e, publishers   as pubs   

    where (pub_name like 'Binnet%'   or pub_name like 'New Moon %')   

    and pubs.pub_id = e.pub_id   

    order by 'pubs! 1! PubName',   'pubs! 1! City',   

    'employee! 2! First_Name',   'employee! 2! Last_Name'   

    for xml explicit     

    Давайте розглянемо все по порядку. Спочатку виконується перший підзапит. Його результат наведено в таблиці 1.        

    tag         

    parent         

    pubs! 1! PubName         

    pubs! 1! City         

    employee! 2! First_Name         

    employee! 2! Last_Name             

    1         

    0         

    New Moon Books         

    Boston         

    NULL         

    NULL             

    1         

    0         

    Binnet & Hardley         

    Washington         

    NULL         

    NULL     

    Таблиця 1.

    Потім другий (Таблиця 2).        

    tag         

    parent         

    pub_name         

    city         

    fname         

    lname             

    2         

    1         

    Binnet & Hardley         

    Washington         

    Paolo         

    Accorti             

    2         

    1         

    Binnet & Hardley         

    Washington         

    Victoria         

    Ashworth             

    2         

    1         

    Binnet & Hardley         

    Washington         

    Helen         

    Bennett             

    2         

    1         

    Binnet & Hardley         

    Washington         

    Lesley         

    Brown             

    ...         

    ...         

    ...         

    ...         

    ...         

    ...     

    Таблиця 2.

    Потім відбувається сортування, і на основі полів tag і parent SQL Server формує ієрархічний XML документ.        

    ПРИМІТКА   

    Для налагодження подібних запитів краще не   вказувати оператор FOR XML EXPLICIT. Тоді дані будуть представлені в   звичайної реляційної формі.     

    На цьому ми, мабуть, закінчимо розгляд оператора FOR XML EXPLICIT - приведення прикладів використання всіх атрибутів зайняло б занадто багато місця.

    OPENXML

    Функція OPENXML є аналогом OPENROWSET, OPENDATASOURCE і OPENQUERY, які дозволяють виконувати запити з віддалених джерел. Ось її синтаксис:        

    OPENXML (idoc   int [in], rowpattern nvarchar [in], [flags byte [in]])   

    [WITH (SchemaDeclaration | TableName)]     

    Аргументи:

    idoc - хендл XML-документа, отриманий за допомогою збереженої процедури sp_xml_preparedocument;

    rowpattern - локалізуемая група XPath або, простіше кажучи, XPath-вираз;

    flags - набір прапорів, які вказують на те, як повинні бути порівняно дані документа XML і реляційного набору рядків;

    ShemaDeclaration - визначення полів реляційного набору рядків у форматі:        

    ColName ColType [ColPattern |   MetaProperty]     

    Де

    ColName - ім'я поля.

    ColType - тип поля. Допускаються всі типи SQL Server.

    ColPattern - локалізуемая група XPath для поля.

    MetaProperty - метасвойство. Його ми розглядати не будемо.

    XML-документ готується за допомогою збереженої процедури sp_xml_preparedocument. Процедура використовує аналізатор MSXML для перевірки документа на правильність і повертає хендл документа. Після завершення роботи з OPENXML хендл потрібно закрити за допомогою процедури sp_xml_removedocument.        

    ПРИМІТКА   

    sp_xml_preparedocument готує   XML-документ, представляючи його у вигляді об'єктної моделі DOM (Document Object   Model). Якщо ви працюєте з великими документами, це може викликати деякі   проблеми.     

    Як видно з синтаксису, ви можете не вказувати прапори і визначення полів для реляційного набору рядків. У цьому випадку SQL Server створить внутрішнє подання XML-документа у так званому "edge table "-форматі. Він практично не читаємо, однак при великому бажанні його можна використовувати. Опис цього формату виходить за рамки цієї статті, але в Як доказ того, що з ним можна працювати, наведу приклад. Нехай у нас є такий XML-документ:        

      

      

      

      

    description = "Системне програмування">   

      

    Alex   Fedotov   

      

      

    description = "Компонентні технології">   

      

       Vi2   

      

      

    description = "Delphi і Builder">   

      

      

      

      

       Sinclair   

      

      

      

      

      

       Merle   

      

      

        

    Ось запит, який повертає загальну кількість повідомлень для кожного форуму:        

    exec   sp_xml_preparedocument @ hdoc out, @ _xmlbody      

    select   [text] as totalposts   

    from openxml (@ hdoc, '/ rsdn/forums/forum') as   f   

    join (select [id], localname   

    from   openxml (@ hdoc, '/ rsdn/forums/forum')   

    where localname = 'totalposts') as d on   d. [id] = f.parentid      

    exec   sp_xml_removedocument @ hdoc     

    Результатом його буде наступна таблиця:        

    totalposts             

    16688             

    10116             

    5001             

    6606     

    Не раджу використовувати подібний метод в рабочіх проектах, і не тільки тому, що він неефективний (як видно з прикладу, XML-документ сканується двічі). Розглянемо приклад, який видає той же самий результат з використанням XPath.        

    exec   sp_xml_preparedocument @ hdoc out, @ _xmlbody      

    select   *   

    from openxml (@ hdoc, '/ rsdn/forums/forum')   

    with (totalposts varchar (100)   'attribute:: totalposts')      

    exec   sp_xml_removedocument @ hdoc     

    Тут, щоб обмежити Реляційний набір рядків, я скористався XPath-виразом.

    Вираз attribute:: totalposts означає, що для поля totalposts буде використовуватися значення однойменного атрибуту. Набагато частіше в XPath-виразах використовується скорочений запис:

    «attribute::» можна замінити символом @;

    «self:: node ()» можна замінити на крапку (.);

    «parent:: node ()» можна замінити на дві точки (..).

    Інші скорочення можна знайти в специфікації XPath.

    Давайте розглянемо більш складний приклад: виберемо назва форуму, модератора і дату створення статистики для всіх форумів, у яких більше 6000 повідомлень.        

    exec sp_xml_preparedocument @ hdoc out, @ _xmlbody      

    select   

    forum as 'Форум',   

    case when moders is null   

    then 'немає'   

    else moders   

    end as 'Модератор',   

    [date] as 'Дата створення'   

    from   openxml (@ hdoc, '/ rsdn/forums/forum [attribute:: totalposts>   "6000"] ') with   

    (   

    moders varchar (50)   'moderators/moderator/attribute:: name',   

    forum varchar (50)   'attribute:: name',   

    [date] varchar (50)   'parent:: node ()/attribute:: date'   

    )      

    exec sp_xml_removedocument @ hdoc     

    Частина запиту, що використовує XPath, можна переписати в скороченій формі:        

    openxml (@ hdoc, '/ rsdn/forums/forum [@ totalposts> "6000"]')   with   

    (   

    moders varchar (50)   'moderators/moderator/@ name',   

    forum varchar (50) '@ name',   

    [date] varchar (50)'../date '   

    )     

    Скрізь далі я буду користуватися скороченим записом.

    Щоб розібратися з прапорами OPENXML, розглянемо злегка модифікований приклад з MSDN:        

    DECLARE @ idoc int   

    DECLARE @ doc varchar (1000)      

    SET @ doc = '   

      

      

       Janine   

      

      

    Customer was very satisfied   

      

      

      

       Ursula   

    Happy   Customer.   

      

    note = "Wrap it   blue white red ">   

    Sad Customer.   

       Important   

      

      

    '      

    - Створення внутрішнього   подання XML-документа.   

    EXEC sp_xml_preparedocument @ idoc OUTPUT, @ doc      

    SELECT *   

    FROM OPENXML (@ idoc,   '/ root/Customer', 2) WITH   

    (   

    cid char (5) '@ cid',   

    [name] varchar (20),   

    oid char (5) 'Order/@ oid',   

    amount float 'Order/@ amount',   

    comment varchar (100)   'Order/text ()'   

    )      

    - Очищення   

    EXEC sp_xml_removedocument @ idoc     

    Результат буде наступним:        

    cid         

    name         

    oid         

    amount         

    comment             

    C1         

    Janine         

    O1         

    3.5         

    Customer was very satisfied             

    C2         

    Ursula         

    O4         

    10000.0         

    Happy Customer.     

    Відзначимо деякі особливості:

    Як режим відображення XML-даних на поля реляційної таблиці використовувалося значення 2 (element-centric mapping). Це означає, що за замовчуванням імена колонок одержуваної реляційної таблиці будуть відповідати іменам вкладених XML-елементів. Крім цього, можливо використання значень 0, 1 і 8. 0 використовується за умовчанням і означає використання attribute-centric mapping. 1, як не дивно, означає те ж саме. Прапори 1 і 2 можна комбінувати за "або", тобто якщо підставити 3, спочатку буде зроблено спробу знайти атрибут з ім'ям, відповідним імені колонки, а потім (якщо атрибут не знайдено) буде проведений пошук елемента з відповідним ім'ям (інакше буде повернуто NULL). Завдяки тому, що в як прапора було вказано значення 2, для поля cid довелося явно вказати XPath-запит, який вказує, що на цю колонку відображається атрибут cid. Для поля name не треба було безпосереднього зазначення XPath-вирази. Якщо б в якості прапора використовувалося значення 1 (використання відображення атрибутів), то картина змінилася б на протилежну: тобто для cid не потрібно б було нічого вказувати, а для name довелося б написати шаблон (тобто просто вираз 'name').

    Особливість застосування XPath-виразів при відображенні даних полягає в тому, що можлива вибірка даних, розташованих практично в будь-якої частини XML-документа (щодо поточної гілки). Так, можна звернутися до подветкам поточної гілки, батьківським гілках, і навіть отримати дані на основі виконання деякого умови. Якщо б замість «comment varchar (100) 'Order/text ()' »було написано« comment varchar (100) 'Order' », то колонка comment першого рядка містила б пустий рядок. Вона бралася б з першого замовлення (O1). Але так як тексту в цьому елементі немає, функція text () поверне для нього false, що призведе до пошуку тексту наступного по порядку елементі Order (замовленні O2). Таким чином, в сформованій запису буде знаходитися інформація з першого замовлення і коментар з другого. Прикладного сенсу це дія не має, але чудово демонструє гнучкість техніки відображення.

    На цьому ми з вами закінчимо розгляд конструкції OPENXML. Більш детальну інформацію можна отримати в MSDN. Специфікацію XPath можна знайти в [2].

    IIS і XML функції SQL Server

    Щоб виконувати запити до SQL Server через HTTP, необхідно налаштувати відповідним чином інтернет-сервер. Робиться це з допомогою майстра "Configure SQL XML Support in IIS". Я не буду описувати повністю його роботу, при необхідності можете звернутися до [3]. Крім цього, настроїти віртуальний каталог можна програмно за допомогою об'єкта VDirMgr. Він знаходиться у файлі sqlvdr3.dll. Для використання класу з VB потрібно додати посилання на бібліотеку типів Microsoft SQL Virtual Directory Control 1.0 Type Library.

    Майстер "Configure SQL XML Support in IIS" створює віртуальний каталог, для обробки запитів до якого призначається спеціальне isapi-розширення: sqlisapi.dll. Ця бібліотека, використовуючи провайдер SQL OLEDB, зв'язується з SQL Server для відправлення запитів і отримання результатів. Результуючі вибірки, представлені вже у форматі XML, передаються назад викликає стороні по HTTP. За допомогою майстра ви можете вказати:

    Обліковий запис SQL Server або Windows, під якою виконуватимуться всі запити;

    Комп'ютер, на якому розташований SQL Server і базу даних;

    підкаталоги даного віртуального каталогу для зберігання різних типів файлів (шаблонів, схем). Підкаталоги можуть бути трьох визначених типів: schema, template і dbobject. У підкаталозі schema зберігаються XDR або XSD схеми даних, які можна безпосередньо виконувати в URL-запиті. У підкаталозі з типом template зберігаються шаблони, виконання яких дозволено через URL-запити. dbobject - псевдокаталог, його ми розглядати не будемо.        

    ПРИМІТКА   

    У SQLXML 3.0 з'явився ще один тип   підкаталогів - soap. Його розгляд також виходить за рамки цієї статті.     

    Окремо зупинимося на настройках каталогу. Ви можете:

    Дозволити або заборонити вказувати SQL-інструкції безпосередньо в URL. Відзначу, що в якості інструкцій можна використовувати не тільки запити, але і будь-які інші оператори. Раджу встановлювати цю опцію тільки для налагодження, а в нормальному режимі роботи вимикати.

    Дозволити або заборонити виконання запитів, що зберігаються у спеціальних шаблонах. Детальніше про шаблони буде сказано далі.

    Дозволити або заборонити використання запитів XPath;

    Дозволити або заборонити використовувати метод POST.

    URL-запити

    Розглянемо синтаксис URL-запиту до SQL Server:        

    http://iisserver/vroot?sql=sqlinstruction [& param = value [& param = value] ... n]     

    Тут:

    iisserver - ім'я інтернет-сервера;

    vroot - ім'я віртуального каталогу;

    sqlinstruction - будь-яка SQL-інструкція;

    param - ім'я параметра. Це не параметр SQL-інструкції або збереженої процедури, це параметр шаблону або один з наступних зумовлених параметрів: contenttype, outputencoding, root і xsl;

    value - значення параметра.

    Отже, припустимо, ви настроїти віртуальний каталог для використання бази даних PUBS і назвали його server_pubs. Покладемо, ваш комп'ютер називається server. Спробуємо написати першим URL-запит:        

    http://server/server_pubs/?sql=select   au_fname, au_lname, address from authors where au_fname like 'M%' for xml raw     

    Але не все так просто. Відповідь буде таким:        

    XML   document must have a top level element.     

    Перший млинець, як завжди, комом! Справа в тому, що XML-документ, що формується SQL Server'ом, не має головного кореневого елемента, без якого документ не може вважатися правильно оформленим. Для вказівки кореневого елемента потрібно додати параметр root.        

    http://server/server_pubs/?sql=select   au_fname, au_lname, address from authors where au_fname like 'M%' for xml   raw & root = my_root     

    У відповідь буде видано:        

    Incorrect syntax near 'M'.     

    Що ж, досвідчені користувачі, напевно, відразу б примітили знак відсотка у запиті. Він є зарезервованим символом у імені URL, його код дорівнює 25. З огляду на це, перепишемо запит так:        

    http://server/server_pubs/?sql=select   au_fname, au_lname, address from authors where au_fname like 'M% 25' for xml   raw & root = my_root     

    Ура! Вийшло. Результат буде приблизно таким же, як в самому першому прикладі цієї статті.

    На випадок, якщо вам потрібно отримати результати у вигляді звичайного HTML, можна створити шаблон перетворення мовою XSL і вказати ще один параметр в URL - xsl. У якості значення параметра потрібно вказати шлях щодо вибраної вами віртуальної директорії.

    Складемо шаблон трансформації:        

      

      

      version = "1.0">   

      

      

      

         

      

  •   

      

      

    .   

    Address:      

      

      

         

      

      

      

        

        

        

        

        

           

          

      Більш докладну інформацію про XSL можна знайти в [4].

      У відповідь на наступний URL-запит ви отримаєте перетворений XML-документ.        

      http://server/server_pubs/?sql=select   au_fname, au_lname, address from authors where au_fname like 'M% 25' for xml   raw & root = my_root & xsl = xsl_for_query.xsl     

      Насправді робота з URL-запитами цікава тільки перші кілька хвилин. Дійсно, дуже незручно возитися з рядком адреси і нескінченними символами відсотка в ній, до того ж URL-запити не дуже гарні в сенсі безпеки. Альтернативою їм є шаблони.

      Шаблони

      Шаблони в контексті цієї статті є звичайними XML-документами, складеними за певними правилами. Основним їх змістом є SQL-запит або виклик збереженої процедури. Шаблони також використовуються для запитів XPath, проте їх я Щодо трохи пізніше. Параметри шаблону задаються в URL-рядку. Якщо вони там не вказані, беруться значення за замовчуванням з відповідних тегів .

      Шаблони зберігаються на сервері, тому в сенсі безпеки їх використання набагато кращий, ніж URL-запитів. Щоб ISAPI-розширення, яка їх обробляє, зрозуміло, що ви викликаєте шаблон, його потрібно помістити в свій віртуальний каталог. Зазвичай він називається template. Налаштувати його можна в згадуваному раніше майстра "Configure SQL XML Support in IIS "на закладці Virtual Names.

      Структура шаблону виглядає так:        

        

        

      sql: xsl = "xsl file   name ">   

        

      param_value   

      param_value ... n   

        

        

      будь-який SQL-вираз   

        

          

      Для форматування результатів виконання шаблону може бути використана XSL-трансформація. Для цього необхідно задати атрибут xsl, значення якого є відносний або повний шлях до файлу, який містить шаблон трансформації. Атрибут xsl необов'язковий, як і розділ header.

      Ось як буде виглядати шаблон, заснований на добряче вже набридлому вам запиті.        

        

        

        sql: xsl = "xsl_for_query.xsl">   

        

      select   au_fname, au_lname, address   

      from authors where au_fname   like 'M%' for xml raw   

        

          

      У ньому використовується та ж схема перетворення, що й у попередньому прикладі. Тепер спробуйте його викликати (припустимо, ви його зберегли під ім'ям first_template.xml):        

      http://server/server_pubs/template/first_template.xml     

      Результат виходить досить дивним: IE представляє HTML-документ (отримується при трансформації) у форматі XML. Робить він це на цілком законних підставах, і щоб результат видавався все-таки в форматі HTML, потрібно явно вказати тип вихідного потоку. Це легко зробити за допомогою параметра contenttype.        

      http://server/server_pubs/template/first_template.xml?contenttype=text/html     

      шаблонів Переваги очевидні:

      Так як шаблон знаходиться на сервері, ви повністю контролюєте його вміст;

      Шаблони набагато простіше у використанні;

      Тіло шаблону і використовується схема перетворення приховані від користувача;

      Шаблони можна динамічно змінювати або створювати, що надає інтернет-серверу додаткову гнучкість;

      За допомогою шаблонів можна виконувати запити XPath, але про це вже в наступному розділі.

      У шаблонах можна використовувати наступні атрибути (розглянуті найбільш використовувані):

      client-side-xml - Булева змінна, що приймає значення 0 або 1. Якщо вказується 1, то при вибірці використовується форматування XML-документа на клієнті. Тобто SQL Server виконує звичайний запит, передає рекордсет клієнту, і вже там проводиться формування документа. Більше докладно клієнтські курсори будуть розглянуті в розділі ADO і XML.        

      ПРИМІТКА   

      В даному випадку є клієнтом   комп'ютер, звідки надходить запит до SQL Server-y, то є машина, де   розташований SQLXMLOLEDB-провайдер. У разі використання ADO - це машина   клієнта. У разі використання шаблонів - сервер IIS.     

      nullvalue - дозволяє задавати рядок, який в URL-запиті, а також запит XPath буде означати NULL.

      is-xml - атрибут параметра, що приймає значення 0 і 1, використовується в розділі header. За замовчуванням він дорівнює 1. Це означає, що значення параметра інтерпретується як фрагмент xml, тому, наприклад, <не замінюється. Якщо встановлено значення 0, параметр інтерпретується як звичайний текст.

      Призначення інших атрибутів можна знайти в MSDN.

      Запити XPath

      XPath не розрахований на роботу з реляційними даними. Для використання XPath-запити для вибірки реляційних даних, необхідно створити схему даних XDR або XSD. XDR було розроблено кілька років тому при активній участі Microsoft, тому що в той час необхідність у схемах даних була, а, по суті, самих схем не було. З появою XSD популярність і актуальність застосування XDR почали падати.        

      ПРИМІТКА   

      Специфікацію XSD можна знайти в [5].     

      Схема даних виконує дві важливі функції: задає структуру майбутнього XML-документа і визначає, які поля і таблиці повинні використовуватися при виконанні запиту XPath. Такі схеми називаються анотований схемами запитів, а атрибути, що зв'язують об'єкти бази даних з XML-вузлами - анотаціями. До виходу в світ SQLXML 2.0 можна було використовувати тільки анотовані схеми на основі SDR [6]. Однак зараз краще використовувати анотовані схеми на основі специфікації XSD [7]. Деяку інформацію з перетворенню схем з XDR в більш новий формат XSD можна знайти в [8].

      Ось синтаксис шаблонів з використанням запитів XPath:        

        

        

      param_value   

      param_value ... n   

        

        

      XPath query   

        

          

      У цьому прикладі анотована схема повинна знаходиться в фото your_schema.xml. Як видно з синтаксису, можливе створення параметризованих запитів XPath. Параметр у запиті позначається початковим символом $.

      Розглянемо приклад анотованої схеми XDR, який використовуватиметься для запитів XPath. У результуючому документі будуть бути присутнім імена, прізвища та адреси всіх авторів:        

        

        

      xmlns: sql = "urn: schemas-microsoft-com: xml-sql"   

      xmlns: dt = "urn: schemas-microsoft-com: datatypes">      

        

        

        

           

        

        

        

        

          

      Тут використовується анотація relation для того, щоб вказати, з якою таблицею буде пов'язаний елемент Authors. Дочірні елементи успадковують зв'язок з таблицею, зазначеної для батьківського ElementType. Пов'язувавие полів таблиці або подання (view) можна виконувати явно, з використанням анотації field. У даному прикладі для елементів AttributeType цього робити не потрібно, тому що відображення на відповідні поля виконуються автоматично. Однак для дочірніх елементів ElementType, які за умовчанням зв'язуються з таблицями, така анотація може бути необхідна. Найбільш часто використовувані анотації наведені далі.

      Тепер можна перейти до самого шаблону. Припустимо, анотований схему ви зберегли під ім'ям MySchema.xml.        

      ПРИМІТКА   

      IIS розрізняє тип XML-документа тільки   на основі каталогу, де він знаходиться. Навіть якщо ми не налаштували спеціальним   чином IIS на виконання схем, їх краще зберігати в одному місці. Я рекомендую   зберігати схеми та шаблони в різних віртуальних каталогах. Наприклад, template   для шаблонів, schema - для схем.     

      Ось так виглядає шаблон, що вибирає імена, прізвища та адреси всіх авторів:        

        

        

      /Authors   

        

          

      Так як схеми XDR поступово витісняються схемами XSD, перепишемо приклад з використанням XSD.        

      ПОПЕРЕДЖЕННЯ   

      Я півтора дня втратив, коли перший раз   намагався виконати запит XPath на XSD-схемі. ISAPI-розширення наполегливо видавало помилку «XPath: unable   to find/authors in the schema ». У   Зрештою, після нетривалих консультацій з одним із учасників   форуму сайту www.sql.ru, проблема була вирішена. Суть її в наступному: при   створення віртуального каталогу я використав оснащення mmc SQL IIS Admin.MSC,   яка входить до стандартного комплекту MS SQL Server'а і нічого не знає про   нові можливості SQLXML 3.0. Нова оснащення лежить в% Program Files% SQLXML   3.0 і називається sqlisad3.msc. Її можна запустити з меню Start-> Programs-> SQLXML   3.0-> Configure IIS Support. Завжди користуйтеся тільки нею.     

      Ось список основних відмінностей XDR від XSD [9], до якого я дуже часто звертаюся:        

      XDR         

      XSD             

      Schema         

      schema             

      ElementType         

      element             

      AttributeType         

      attribute             

      attribute         

      none     

      З урахуванням цього схема буде виглядати так:        

        

        xmlns: sql = "urn: schemas-microsoft-com: mapping-schema">   

        

        

        

        

        

        

        

          

      Тут явно вказані анотації, що дозволяють зв'язати XML-елементи до таблиці authors та відповідними полями. У цьому випадку все вони не обов'язкові, тому що SQLXML може вивести зв'язку з назв вузлів. Ось приклад, де анотації дійсно необхідні. Для різноманітності адресу і прізвище винесені в окремі елементи:        

        

        

      xmlns: sql = "urn: schemas-microsoft-com: mapping-schema">   

        

        

        

        

         
  •  
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status