powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / импорт записи из XML без перечисления полей
6 сообщений из 6, страница 1 из 1
импорт записи из XML без перечисления полей
    #39562524
urachins
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В отдельной таблице хранятся образы удаленных записей в формате xml из РАЗНЫХ таблиц, типа

declare @RowData as xml
set @RowData = cast((SELECT top 1 * FROM MyTable1
FOR XML AUTO, ELEMENTS) as xml)

Хочу добавлять такие данные универсальным способом без явного перечисления полей в INSERT. Все примеры, что я видел с OPENROWSET, OPENXML требуют указания полей да еще и типов. Неужели нет простого способа, ведь XML и так содержит все их названия?

<MyTable1>
<Company>MyComp1</Company>
<PartNum>1032KNUT</PartNum>
<ClassID>HDW</ClassID>
<IUM>EA</IUM>
</MyTable1>

Спасибо
...
Рейтинг: 0 / 0
импорт записи из XML без перечисления полей
    #39562569
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urachins,

напишите свой билдер запросов. Чудесных превращений типов и имен не бывает. И Деда Мороза с телепатией тоже.
Ну и что, что содержит? Названия и количество тэгов вовсе не обязаны соответствовать названиям и количеству полей таблицы.
...
Рейтинг: 0 / 0
импорт записи из XML без перечисления полей
    #39562825
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И тип данных из приведенного сервер угадывать не умеет:
Код: xml
1.
<node>20200220<node>


догадайтесь с трех раз, это строка, число (какого типа?), или дата?
...
Рейтинг: 0 / 0
импорт записи из XML без перечисления полей
    #39562916
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зато он отлично разбирается d_TotalSum и dt_SaleDate ;)
...
Рейтинг: 0 / 0
импорт записи из XML без перечисления полей
    #39564168
urachins
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, я надеялся, что SQL сможет сам конвертировать строки в нужный тип, но это не так, а вот такой код работает для любой таблицы
входящие параметры - имя схемы и имя таблицы, (образы записей в xml хранились в RChangeLog с тегом Updated), через
openxml :

Код: sql
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.
31.
32.
33.
34.
35.
36.
declare @SchemaName nvarchar(3) = 'dbo'
declare @TableName nvarchar(50) = 'MyTable'

declare @ColumnList nvarchar(max) = ''
declare @ColTypeList nvarchar(max) = ''

SELECT @ColumnList = @ColumnList + column_name + ',',
@ColTypeList = @ColTypeList + column_name + ' ' + DATA_TYPE 
+ (case 
	when CHARACTER_MAXIMUM_LENGTH is Null  then ''
	when CHARACTER_MAXIMUM_LENGTH = -1 then '(MAX)'
	else '(' + cast(CHARACTER_MAXIMUM_LENGTH as varchar) + ')'
end) 
+ ' ''' +  column_name + ''','
FROM INFORMATION_SCHEMA.Columns
WHERE table_name = @TableName
and TABLE_SCHEMA = @SchemaName
and DATA_TYPE <> 'timestamp'

select @ColumnList = SUBSTRING(@ColumnList,1,len(@ColumnList) -1), 
       @ColTypeList = SUBSTRING(@ColTypeList,1,len(@ColTypeList) -1)

declare @SQL nvarchar(max)
set @SQL =
 'declare @OldRow xml;'
+'Set @OldRow = /* Вставить свой код */ (select OldRowData from dbo.RChangeLog where... ;'
+ 'declare @idoc int; ' +
+' EXEC sp_xml_preparedocument @idoc OUTPUT, @OldRow ;'
+ ' insert into ' + @SchemaName +'.' + @TableName 
+' (' + @ColumnList +')'
+ 'select '
+ @ColumnList 
+ ' from openxml(@idoc, N''/Updated'',1)'
+ ' with ('+ @ColTypeList + ')'

exec(@SQL)
...
Рейтинг: 0 / 0
импорт записи из XML без перечисления полей
    #39564178
unknownuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urachins Все примеры, что я видел с OPENROWSET, OPENXML требуют указания полей да еще и типов. Неужели нет простого способа, ведь XML и так содержит все их названия?



OPENXML( idoc int [ in] , rowpattern nvarchar [ in ] , [ flags byte [ in ] ] )
[ WITH ( SchemaDeclaration | TableName ) ]

TableName
Is the table name that can be given (instead of SchemaDeclaration) if a table with the desired schema already exists and no column patterns are required .
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / импорт записи из XML без перечисления полей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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