Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Янин В.Л. "Новгородские акты XII-XV Хронологический комментарий" (История)

Майринк Г. "Белый доминиканец " (Художественная литература)

Хусаинов А. "Голоса вещей. Альманах том 2" (Художественная литература)

Петров Г.И. "Отлучение Льва Толстого " (Художественная литература)

Хусаинов А. "Голоса вещей. Альманах том 1 " (Художественная литература)
Реклама

Microsoft SQL server. Реализация и обслуживание Учебный курс - Microsoft press

Microsoft press Microsoft SQL server. Реализация и обслуживание Учебный курс — Microsoft Press, 2007. — 766 c.
Предыдущая << 1 .. 121 122 123 124 125 126 < 127 > 128 129 130 131 132 133 .. 343 >> Следующая

Метод nodes() возвращает табличный результирующий набор. Этот результирующий набор представляет таблицу, содержащую отдельный столбец типа XML. Для каждого XML-узла, отвечающего заданному выражению XQUERY, возвращается новая строка.
Поскольку результирующий набор, возвращаемый методом nodesQ, содержит один столбец типа XML, нужно применять другие методы, поддерживаемые типом данных XML, — valueQ, queryQ, existQ — для извлечения данных из каждой строки.
В следующем коде показано, как использовать метод nodes():
SELECT C.value('@icT,’int') AS ID,
C.value('@name',’nvarchar(max)’) AS [NAME],
C.value('count(./Employees/*) \ 'int') AS EMPL0YEE_C0UNT,
C.queryC./Employees') AS EMPL0YEE_LIST FROM @X.nodes('/Departments/Department') T(C)
GO
На рис. 8-5 показан результат этого запроса. т I mm „ 1 тшшлшт 1
I Engineering 6 <Emoloyees>4 Employee id="3" StartDate="1997-12-1
2 Tool Design 4 <Emoloyee$>< Employee id="5" StartDate="1998-01-1
3 Sales 18 <Emoloyees>< Employee id="268" StartDate="2001 -02
4 Marketing 9 <Employee$>< Employee id="2" StartDate="1997-02-2
5 Purchasing 12 <Emplovees><Employee id="164" StartDate="1999-03
В Research and Development 4 <Emplovees>< Employee id="79" StartDate="1999-01
7 Production 179 <ЕгпоІоуее$>< Employee id="1" StartDate="1996-07-3
8 Production Control Є <EmDloyees><Employee id="21" StartDate="1999-01-
9 Human Resources 6 <Employees><Employee id="30" StartDate="1999-01-
10 Finance 10 <Emplovees><Employee id="59" StartDate="1999-01-
11 Information Services 10 <Employees><Employee id="28" StartDate="1999 01-
12 Document Control 5 <Emplovees>< Employee id="54" StartDate="1999-01-
13 Quality Assurance 6 <EmploveesxEmployee id="41" StartDate="1999-01
14 Facilities and Maintenance 7 <Emplovees><Employee id="49" StartDate="1393-01 -
15 Shipping and Receiving В <Emplovees><Employee id="34" StartDate="1999-01-
16 Executive 2 <Emolovee$>< Employee id="109" StartDate="1999-02
Рис. 8-5. Результат запроса с применением метода nodesQ
ПРИМЕЧАНИЕ Производительность OPENXML и метода nodesQ
Метод nodesQ более эффективен, чем выражение OPENXML, поскольку не требует загрузки в память и синтаксического анализа XML-структуры перед выполнением ее запроса и разбиения. Тип данных XML в SQL Server 2005 хранит XML-данные во внутренней структуре, которая внешне очень похожа на краевую таблицу.
Занятие 5
Преобразование между XML-данными и реляционными данными
263
Использование операторов CROSS APPLY и OUTER APPLY
Если таблица содержит столбец типа XML, метод nodesQ в выражении SELECT вызывать нельзя. Поскольку метод nodes() возвращает результирующий набор, выражение SELECT не позволит его вызвать, поэтому следующий запрос не будет выполнен:
-- Создание новой таблицы.
CREATE TABLE Т(С1 XML);
- Запрос к таблице.
SELECT С1. nodes( 'выражение_ХОиЕИУ')
FROM Т
Поскольку метод nodesQ должен быть вызван для столбца XML, его также нельзя вызвать в разделе FROM запроса SELECT, поэтому следующий запрос тоже не выполнится:
-- Создание новой таблицы.
CREATE TABLE Т(С1 XML);
- Запрос к таблице.
SELECT *
FROM T.C1.nodes( 'выражение_ХОиЕИУ')
Чтобы вызвать метод nodesQ для столбца типа XML, следует использовать операторы APPLY, позволяющие вызвать функцию для каждой строки, возвращенной запросом.
Оператор CROSS APPLY возвращает из вызванной функции только те результаты, которые не равны NULL. Оператор OUTER APPLY возвращает все результаты, даже если они равны NULL. С применением операторов APPLY можно вызвать метод nodesQ для каждой строки, возвращенной запросом.
Следующий код показывает, как применять метод nodesQ для столбца типа XML с помощью оператора CROSS APPL Y:
SELECT Т. C. value( ’@id ’, ’ int ’) AS ID,
T.C.value(’@name','nvarchar(max)’) AS [NAME],
Т.C.value(’count(./Employees/*)', ’int’) AS T0TAL_EMPL0YEE_C0UNT, T2.C.query(’.') EMPL0YEES_0LDER_THAN_7 FROM @X.nodes('/Departments/Department') T(C)
CROSS APPLY Т. C.nodes('./Employees[Employee/@YearsInRole>7]') T2(C)
На рис. 8-6 показан результат этого запроса.
| ~~ I TQTAijEMFIX^yEE^CXIUNT f ?MPtOY?€S^QlD?B_THANjI {
j Engineering 6 <Employees>< Employee id="3" StartPate="1997-12-1
2 Tool Design 4 <.EmployeesxEmployee id="5“ StartPate="1998-01-1
Jill 4 Marketing 9 <Employees><Employee id="2" StartPate=‘'1997-02-2
m 7 Production 179 <Employees>< Employee id=“1" StartPate="1996-07-3
Рис. 8-6. Результаты запроса с применением метода nodesQ с оператором CROSS APPLY
На примере следующего кода показано, как применять метод nodesQ для столбца типа XML с помощью оператора OUTER APPLY.
264
Управление XML-данными
Глава 8
SELECT T.C.value(’@idVint’) AS ID,
Т.C.value('@name','nvarchar(max)') AS [NAME],
T C.value('count(./Employees/*)’, ’int’) AS T0TAL_EMPL0YEE_C0UNT, T2.C.query(’.’) EMPL0YEES_0LDER_THAN_7 FROM @X.nodes('/Departments/Department') T(C)
OUTER APPLY Т.C.nodes(’./Employees[Employee/@YearsInRole>7]') T2(C)
На рис. 8-7 показан результат этого запроса.
ё
ML-
Епдятееппд
1 щяишшгешш I штйтишюштм
T ool Design
Предыдущая << 1 .. 121 122 123 124 125 126 < 127 > 128 129 130 131 132 133 .. 343 >> Следующая