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

Откуда:
Сообщений: 706
Всем привет, у меня есть sql сolumn c данными, которые я привожу в обычный табличный вид следующим способом:
SET NOCOUNT ON;
DECLARE @XML AS XML, @hDoc AS INT
SELECT @XML = (select top 1 serialized from t1 order by id desc)
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT mNresultKey,persid
FROM OPENXML(@hDoc, 'saveState/l_list/person/list_of_item/BaseItem/mNresultKey') 
WITH 
(
mNresultKey [int] 'text()',
persid [char](15) '../../../@ID' 
)
EXEC sp_xml_removedocument @hDoc
и еще у меня есть точно такая же таблица (со столбцами mNresultKey и persid ), которую я хочу синхронизировать с полученным набором данных с помощью merge

SET NOCOUNT ON;
DECLARE @XML AS XML, @hDoc AS INT
SELECT @XML = (select top 1 serialized from tbl_delivery_brig_store order by id desc)
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
 
 MERGE tbl_store_history trg -- таблица приемник
USING (
SELECT mNresultKey,persid
FROM OPENXML(@hDoc, 'saveState/l_list/person/list_of_item/BaseItem/mNresultKey') 
WITH 
(
mNresultKey [int] 'text()',
persid [char](15) '../../../@ID' 
)
) src -- таблица источник
ON trg.mNresultKey=src.mNresultKey -- условие слияния
WHEN MATCHED THEN
 UPDATE SET trg.persId=src.persId;

EXEC sp_xml_removedocument @hDoc


Однако ни в какую не получается- можно ли обойтись без темповой таблицы?
Хотя в документации к Merge описывается, что можно использовать
OPENXML для таблицы- источника:
<table_source> ::=   
{  
    table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ]   
        [ WITH ( table_hint [ [ , ]...n ] ) ]   
  | rowset_function [ [ AS ] table_alias ]   
        [ ( bulk_column_alias [ ,...n ] ) ]   
  | user_defined_function [ [ AS ] table_alias ]  
  | OPENXML <openxml_clause>   
  | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]   
  | <joined_table>   
  | <pivoted_table>   
  | <unpivoted_table>   
} 
11 апр 18, 16:43    [21330429]     Ответить | Цитировать Сообщить модератору
 Re: merge с openXml  [new]
Konst_One
Member

Откуда:
Сообщений: 11518
так без with же
11 апр 18, 16:44    [21330433]     Ответить | Цитировать Сообщить модератору
 Re: merge с openXml  [new]
vb_sub
Member

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

SET NOCOUNT ON;
DECLARE @XML AS XML, @hDoc AS INT
SELECT @XML = (select top 1 serialized from tbl_delivery_brig_store order by id desc)
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
 
 MERGE tbl_store_history trg -- таблица приемник
USING (
SELECT mNresultKey,persid
FROM OPENXML(@hDoc, 'saveState/l_list/person/list_of_item/BaseItem/mNresultKey') 
) src -- таблица источник
ON trg.mNresultKey=src.mNresultKey -- условие слияния
WHEN MATCHED THEN
 UPDATE SET trg.persId=src.persId;

EXEC sp_xml_removedocument @hDoc


не работает, как без with xml в табличный вид переведется.
11 апр 18, 17:17    [21330598]     Ответить | Цитировать Сообщить модератору
 Re: merge с openXml  [new]
Konst_One
Member

Откуда:
Сообщений: 11518
черех временную таблицу делайте
11 апр 18, 17:22    [21330622]     Ответить | Цитировать Сообщить модератору
 Re: merge с openXml  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
vb_sub,

MERGE tbl_store_history trg -- таблица приемник
USING (
SELECT
 b.n.value('text()', 'int'),
 b.n.value('../../../@ID','char(15)')
  mNresultKey,persid
 mNresultKey,persid
from
 tbl_delivery_brig_store a cross apply
 a.serialized.nodes('saveState/l_list/person/list_of_item/BaseItem/mNresultKey') b(n)
) src(mNresultKey, persid)
ON trg.mNresultKey=src.mNresultKey -- условие слияния
WHEN MATCHED THEN
 UPDATE SET trg.persId=src.persId;
11 апр 18, 17:32    [21330650]     Ответить | Цитировать Сообщить модератору
 Re: merge с openXml  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
vb_sub,

[ WITH <common_table_expression> [,...n] ]  
MERGE   
11 апр 18, 17:34    [21330655]     Ответить | Цитировать Сообщить модератору
 Re: merge с openXml  [new]
vb_sub
Member

Откуда:
Сообщений: 706
invm,
к сожалению не проходит.
**** требует одноэлементного множества (или пустой последовательности), обнаружен операнд типа "xdt:untypedAtomic *".
Ок через временную таблицу буду.
11 апр 18, 17:58    [21330753]     Ответить | Цитировать Сообщить модератору
 Re: merge с openXml  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
vb_sub
**** требует одноэлементного множества (или пустой последовательности), обнаружен операнд типа "xdt:untypedAtomic *".
Предлагаете угадать структуру вашего xml?
11 апр 18, 18:00    [21330763]     Ответить | Цитировать Сообщить модератору
 Re: merge с openXml  [new]
vb_sub
Member

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

<saveState xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <l_list>
    <person ID="M35832">
      <list_of_item>
        <BaseItem xsi:type="itemClass">
          <mNresultKey>3970543</mNresultKey>
        </BaseItem>
        <BaseItem xsi:type="itemClass">
          <mNresultKey>3970219</mNresultKey>
        </BaseItem>
        <BaseItem xsi:type="itemClass">
          <mNresultKey>3970671</mNresultKey>
        </BaseItem>
      </list_of_item>
    </person>
    <person ID="q42062" >
      <list_of_item>
        <BaseItem xsi:type="itemClass">
          <mNresultKey>3970463</mNresultKey>
        </BaseItem>
        <BaseItem xsi:type="itemClass">
          <mNresultKey>3970541</mNresultKey>
        </BaseItem>
        <BaseItem xsi:type="itemClass">
          <mNresultKey>3970413</mNresultKey>
        </BaseItem>
      </list_of_item>
    </person>
  </l_list>
</saveState>
11 апр 18, 18:39    [21330889]     Ответить | Цитировать Сообщить модератору
 Re: merge с openXml  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
vb_sub,

 b.n.value('text()[1]', 'int')
либо просто
 b.n.value('.', 'int')
11 апр 18, 20:32    [21331108]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить