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

Откуда:
Сообщений: 68
Здравствуйте, уважаемые форумчане!
Хотел бы попросить вашего мудрого совета АКА помощи в решении задачи. Собственно сама задача:
Дана таблица([LEADER].[dbo].[OVERTIMES] ) с двумя столбцами ID (uniqueidentifier) и OvertimeXML(XML). Мне нужно пробежать по таблице, вытащить из OvertimeXML(XML) нужные мне значения по заданным мною условиям и записать это все во временную таблицу.
Из XML вытаскиваю значения следующим образом:
DECLARE name_cursor CURSOR
FOR
   Select OverTimeXml From [LEADER].[dbo].[OVERTIMES]  --исходная таблица
OPEN name_cursor
DECLARE @xmlVal XML
declare @MyTempTable1 table(AActDuration nvarchar(200)
, Namee nvarchar(400),OOperation nvarchar(200))
DECLARE @idoc int
FETCH NEXT FROM name_cursor INTO @xmlVal
WHILE (@@FETCH_STATUS = 0)
BEGIN
   EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlVal
   Insert into @MyTempTable1 (AActDuration,Namee,OOperation ) 
   ( SELECT ActDuration,Name,Operation  
   FROM   OPENXML (@idoc, '/Tasks/Task',1)
    WITH (ActDuration  varchar(100) ,Name  varchar(100),Operation varchar (400)) where 
    Name like '%523%' or Operation like '%523%')  --условия
   EXEC sp_xml_removedocument @idoc
   FETCH NEXT FROM name_cursor INTO @xmlVal
END
CLOSE name_cursor
DEALLOCATE name_cursor 
select * from @MyTempTable1

Но как мне привинтить к результату значение ячейки ID (uniqueidentifier) ума не приложу.
Дорогие специалисты, будьте так любезны подскажите как быть.
23 авг 16, 16:07    [19579824]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
USE [LEADER]
GO

IF OBJECT_ID('tempdb.dbo.#temp') IS NOT NULL
    DROP TABLE #temp
GO

SELECT *
INTO #temp
FROM (
    SELECT  ID,
          AActDuration = t.c.value('(ActDuration/text())[1]', 'NVARCHAR(200)')
        , Namee = t.c.value('(name/text())[1]', 'NVARCHAR(400)')
        , OOperation = t.c.value('(Operation/text())[1]', 'NVARCHAR(200)')
    FROM dbo.OVERTIMES o
    CROSS APPLY o.OverTimeXml.nodes('/Tasks/Task') t(c)
) t
WHERE Namee LIKE '%523%'
    OR OOperation LIKE '%523%'

SELECT * FROM #temp 

Если такой вариант Вас устроит?
23 авг 16, 16:21    [19579918]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AANovikov
Member

Откуда:
Сообщений: 68
AlanDenton,
Спасибо за помощь, запрос вроде работает, но не выводит ни одной строчки!( то есть не совсем работает, попробую разобраться
23 авг 16, 16:35    [19580028]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AANovikov
Member

Откуда:
Сообщений: 68
AlanDenton,
Если убрать условия, то столбцах aactduration,namee,ooperation значения NULL
23 авг 16, 16:37    [19580045]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Структуру XML покажите... Написано все же на глаз все. Мог где-то и ошибиться.
23 авг 16, 16:43    [19580076]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @temp TABLE (ID INT PRIMARY KEY, OverTimeXml XML)

INSERT INTO @temp (ID, OverTimeXml)
VALUES (1, 
'<Tasks>
    <Task>
        <ActDuration>test523</ActDuration>
        <name>test523</name>
        <Operation>test523</Operation>
    </Task>
    <Task>
        <ActDuration>test_523</ActDuration>
        <name>test_523</name>
        <Operation>test_523</Operation>
    </Task>
</Tasks>')

SELECT *
FROM (
    SELECT 
          AActDuration = t.c.value('(ActDuration/text())[1]', 'NVARCHAR(200)')
        , Namee = t.c.value('(name/text())[1]', 'NVARCHAR(400)')
        , OOperation = t.c.value('(Operation/text())[1]', 'NVARCHAR(200)')
    FROM @temp o
    CROSS APPLY o.OverTimeXml.nodes('/Tasks/Task') t(c)
) t
WHERE Namee LIKE '%523%'
    OR OOperation LIKE '%523%'

Все кошерно выполняется. Структура XML Вашего нужна.
23 авг 16, 16:49    [19580116]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AANovikov
Member

Откуда:
Сообщений: 68
AANovikov,
Tasks>
  <Task Name="Зачистка сварочных швов изнутри 877-4210-032, колпак клапана ПВД" Zakaz="2804" Operation="1" PlanQTY="3,5" PlanDuration="1" ActQTY="1" ActDuration="3,5" />
</Tasks>

Это в столбце OvertimeXML
23 авг 16, 16:51    [19580128]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
SELECT 
      AActDuration = t.c.value('@ActDuration', 'NVARCHAR(200)')
    , Namee = t.c.value('@Name', 'NVARCHAR(400)')
    , OOperation = t.c.value('@Operation', 'NVARCHAR(200)')

Вот этот подмените на тот, что я раньше привел
23 авг 16, 16:54    [19580149]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AANovikov
Member

Откуда:
Сообщений: 68
AlanDenton,
<Tasks>
<Task Name="Зачистка сварочных швов изнутри 877-4210-032, колпак клапана ПВД" Zakaz="2804" Operation="1" PlanQTY="3,5" PlanDuration="1" ActQTY="1" ActDuration="3,5" />
</Tasks>
Это в столбце overtimexml, а в столбце id unique identifier. Мне помимо парсинга хмл его нужно вывести. Спасибо за ваши ответы!
23 авг 16, 16:55    [19580151]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AANovikov
Member

Откуда:
Сообщений: 68
AlanDenton,
Я прошу прощения, но админы заблокировали возможность мне отправлять письма на форум, поэтому вынужден писать с телефона. Прикладываю скриншот

К сообщению приложен файл. Размер - 140Kb
23 авг 16, 17:08    [19580240]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
USE [LEADER]
GO

IF OBJECT_ID('tempdb.dbo.#temp') IS NOT NULL
    DROP TABLE #temp
GO

SELECT *
INTO #temp
FROM (
    SELECT OverTimeUserID
         , AActDuration = t.c.value('@ActDuration', 'NVARCHAR(200)')
         , Namee = t.c.value('@Name', 'NVARCHAR(400)')
         , OOperation = t.c.value('@Operation', 'NVARCHAR(200)')
    FROM dbo.OVERTIMES o
    CROSS APPLY o.OverTimeXml.nodes('/Tasks/Task') t(c)
) t
WHERE Namee LIKE '%523%'
    OR OOperation LIKE '%523%'

SELECT * FROM #temp 

Только просьба не говорить что не работает и теперь :)
23 авг 16, 17:11    [19580257]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML (парсинг) , join  [new]
AANovikov
Member

Откуда:
Сообщений: 68
AlanDenton,
Высший пилотаж! Спасибо вам огромное! Надо будет покурить тему с cross apply! Ещё раз огромное спасибо, даже не надеялся, что с решением мне помогут так быстро!!!
23 авг 16, 17:24    [19580348]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить