powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / merge с openXml
10 сообщений из 10, страница 1 из 1
merge с openXml
    #39628577
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, у меня есть 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
merge с openXml
    #39628578
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так без with же
...
Рейтинг: 0 / 0
merge с openXml
    #39628625
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
merge с openXml
    #39628628
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
черех временную таблицу делайте
...
Рейтинг: 0 / 0
merge с openXml
    #39628633
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
merge с openXml
    #39628635
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,

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

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

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


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