Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / merge с openXml / 10 сообщений из 10, страница 1 из 1
11.04.2018, 16:43
    #39628577
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge с openXml
Всем привет, у меня есть sql сolumn c данными, которые я привожу в обычный табличный вид следующим способом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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 для таблицы- источника:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<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>   
} 
...
Рейтинг: 0 / 0
11.04.2018, 16:44
    #39628578
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge с openXml
так без with же
...
Рейтинг: 0 / 0
11.04.2018, 17:17
    #39628625
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge с openXml
Konst_One,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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 в табличный вид переведется.
...
Рейтинг: 0 / 0
11.04.2018, 17:22
    #39628628
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge с openXml
черех временную таблицу делайте
...
Рейтинг: 0 / 0
11.04.2018, 17:32
    #39628633
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge с openXml
vb_sub,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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;
...
Рейтинг: 0 / 0
11.04.2018, 17:34
    #39628635
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge с openXml
vb_sub,

Код: sql
1.
2.
[ WITH <common_table_expression> [,...n] ]  
MERGE   
...
Рейтинг: 0 / 0
11.04.2018, 17:58
    #39628651
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge с openXml
invm,
к сожалению не проходит.
**** требует одноэлементного множества (или пустой последовательности), обнаружен операнд типа "xdt:untypedAtomic *".
Ок через временную таблицу буду.
...
Рейтинг: 0 / 0
11.04.2018, 18:00
    #39628653
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge с openXml
vb_sub**** требует одноэлементного множества (или пустой последовательности), обнаружен операнд типа "xdt:untypedAtomic *".Предлагаете угадать структуру вашего xml?
...
Рейтинг: 0 / 0
11.04.2018, 18:39
    #39628680
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge с openXml
invm,

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<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>
...
Рейтинг: 0 / 0
11.04.2018, 20:32
    #39628718
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge с openXml
vb_sub,

Код: sql
1.
 b.n.value('text()[1]', 'int')

либо просто
Код: sql
1.
 b.n.value('.', 'int')
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / merge с openXml / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]