Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите составить select  [new]
MAULER
Member

Откуда:
Сообщений: 926
Добрый день.

есть таблица одно из полей которой имеет тип XML.

Каждое значение поля таблицы имеет такой формат:
<nvarchar1>ИВАНОВ Иван Иванович</nvarchar1>
<nvarchar3>ОСАПР</nvarchar3>
<nvarchar4>ул. Ленина</nvarchar4>
<nvarchar5>1-91</nvarchar5>
<nvarchar6>21493905</nvarchar6>
<nvarchar7>2144</nvarchar7>
<nvarchar8>Ведущий инженер-программист</nvarchar8>
<nvarchar9>318</nvarchar9>
<nvarchar12>4 Другие</nvarchar12>


<nvarchar1>Петров Петр Петрович</nvarchar1>
<nvarchar3>АСУ</nvarchar3>
<nvarchar4>ул. Горького</nvarchar4>
<nvarchar5>1-92</nvarchar5>
<nvarchar6>214905</nvarchar6>
<nvarchar7>2145</nvarchar7>
<nvarchar8>программист</nvarchar8>
<nvarchar9>338</nvarchar9>
<nvarchar12>4 Другие</nvarchar12>


и т.д.

Как мне написать select, чтобы значение тэга <nvarchar1> было первым столбцом вывода, а значение тега <nvarchar7> - вторым столбцом?

Как то так:

ИВАНОВ Иван Иванович 2144
Петров Петр Петрович 2145
...
12 июл 16, 14:35    [19399996]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить select  [new]
CrazHunt
Member

Откуда:
Сообщений: 40
а сам XML уже разобрали?
Если да, тогда временная таблица (или табличная переменная или просто таблица - что больше нравится) с указанием очередности сортировки
12 июл 16, 14:52    [19400086]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить select  [new]
MAULER
Member

Откуда:
Сообщений: 926
CrazHunt,

Что Вы имеете ввиду под разобрали? :)
Просто есть поле таблицы, содержимое которого представлено в виде XML-структуры. Мне как бы не удобно с таким вот представлением работать. Хочется какой то хитрый Select где парсится эта структура в два (вычисляемых?) поля..
12 июл 16, 14:56    [19400115]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить select  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @t TABLE (x XML)
INSERT INTO @t
VALUES 
    (N'<nvarchar1>ИВАНОВ Иван Иванович</nvarchar1>
    <nvarchar3>ОСАПР</nvarchar3>
    <nvarchar4>ул. Ленина</nvarchar4>
    <nvarchar5>1-91</nvarchar5>
    <nvarchar6>21493905</nvarchar6>
    <nvarchar7>2144</nvarchar7>
    <nvarchar8>Ведущий инженер-программист</nvarchar8>
    <nvarchar9>318</nvarchar9>
    <nvarchar12>4 Другие</nvarchar12>'),
    (N'<nvarchar1>Петров Петр Петрович</nvarchar1>
    <nvarchar3>АСУ</nvarchar3>
    <nvarchar4>ул. Горького</nvarchar4>
    <nvarchar5>1-92</nvarchar5>
    <nvarchar6>214905</nvarchar6>
    <nvarchar7>2145</nvarchar7>
    <nvarchar8>программист</nvarchar8>
    <nvarchar9>338</nvarchar9>
    <nvarchar12>4 Другие</nvarchar12>')

SELECT x.value('(nvarchar1/text())[1]', 'NVARCHAR(400)'),
       x.value('(nvarchar7/text())[1]', 'INT')
FROM @t
12 июл 16, 15:08    [19400201]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить select  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Как вариант можете попробовать COLUMN_SET заюзать:

USE tempdb
GO

IF OBJECT_ID('dbo.DatabaseLog', 'U') IS NOT NULL
	DROP TABLE dbo.DatabaseLog
GO

CREATE TABLE dbo.DatabaseLog (
    DatabaseLogID INT PRIMARY KEY,
    XmlData XML COLUMN_SET FOR ALL_SPARSE_COLUMNS,
    EventType VARCHAR(100) SPARSE NULL,
    TSQLCommand XML SPARSE NULL 
)

INSERT INTO dbo.DatabaseLog(DatabaseLogID, XmlData)
SELECT DatabaseLogID,
       XmlEvent.query('/EVENT_INSTANCE/*[local-name(.) = ''EventType'' or local-name(.) = ''TSQLCommand'']')
FROM AdventureWorks2012.dbo.DatabaseLog

SELECT DatabaseLogID, XmlData, EventType, TSQLCommand
FROM dbo.DatabaseLog
GO


либо создать две скалярные функции и на основе их сделать два вычисляемых столбца со свойством PERSISTED.
12 июл 16, 15:16    [19400257]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить select  [new]
MAULER
Member

Откуда:
Сообщений: 926
AlanDenton,

очень интересно.
12 июл 16, 18:49    [19401389]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить select  [new]
MAULER
Member

Откуда:
Сообщений: 926
Поясните, а зачем мне инсертить во временную таблицу в XML-поле, значение того же xml, если у меня есть реальная таблица с таким же полем?

я уже думаю, может substring-ом выцепить ФИО и телефон...
12 июл 16, 18:55    [19401417]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить select  [new]
MAULER
Member

Откуда:
Сообщений: 926
AlanDenton,

Вы меня спасли! Спасибо. Всё работает )
13 июл 16, 06:40    [19402576]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить select  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Пожалуйста. Вот еще один вариант о котором ранее говорил.

IF OBJECT_ID('dbo.get_nvarchar1') IS NOT NULL
    DROP FUNCTION dbo.get_nvarchar1
GO

CREATE FUNCTION dbo.get_nvarchar1(@x XML)
RETURNS NVARCHAR(400)
WITH SCHEMABINDING
BEGIN
   RETURN @x.value('(nvarchar1/text())[1]', 'NVARCHAR(400)')
END
GO

ALTER TABLE dbo.tbl
     ADD nvarchar1 AS dbo.get_nvarchar1(XmlData) PERSISTED
GO

это в случае если у Вас много раз идет обращение к данным из этого XML.
13 июл 16, 10:51    [19403186]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить select  [new]
MAULER
Member

Откуда:
Сообщений: 926
AlanDenton,

Спасибо. Не много не то что мне нужно, но Вашу идею я ухватил! :)
13 июл 16, 13:13    [19403998]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить