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

Откуда:
Сообщений: 11
В отдельной таблице хранятся образы удаленных записей в формате 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>

Спасибо
1 дек 17, 13:25    [20998227]     Ответить | Цитировать Сообщить модератору
 Re: импорт записи из XML без перечисления полей  [new]
Владислав Колосов
Member

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

напишите свой билдер запросов. Чудесных превращений типов и имен не бывает. И Деда Мороза с телепатией тоже.
Ну и что, что содержит? Названия и количество тэгов вовсе не обязаны соответствовать названиям и количеству полей таблицы.
1 дек 17, 14:35    [20998467]     Ответить | Цитировать Сообщить модератору
 Re: импорт записи из XML без перечисления полей  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5620
И тип данных из приведенного сервер угадывать не умеет:
<node>20200220<node>

догадайтесь с трех раз, это строка, число (какого типа?), или дата?
1 дек 17, 19:18    [20999411]     Ответить | Цитировать Сообщить модератору
 Re: импорт записи из XML без перечисления полей  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
Зато он отлично разбирается d_TotalSum и dt_SaleDate ;)
2 дек 17, 00:39    [20999998]     Ответить | Цитировать Сообщить модератору
 Re: импорт записи из XML без перечисления полей  [new]
urachins
Member

Откуда:
Сообщений: 11
Да, я надеялся, что SQL сможет сам конвертировать строки в нужный тип, но это не так, а вот такой код работает для любой таблицы
входящие параметры - имя схемы и имя таблицы, (образы записей в xml хранились в RChangeLog с тегом Updated), через
openxml :

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)
5 дек 17, 09:51    [21006212]     Ответить | Цитировать Сообщить модератору
 Re: импорт записи из XML без перечисления полей  [new]
unknownuser
Guest
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.
5 дек 17, 10:01    [21006248]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить