powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Импорт данных из XML в MS SQL SERVER с помощью openrowset и openxml
8 сообщений из 8, страница 1 из 1
Импорт данных из XML в MS SQL SERVER с помощью openrowset и openxml
    #40069164
lodry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?xml version="1.0" encoding="UTF-8"?>
<root>
	 <success>1</success>
	<type>item_group</type>
	<count>980</count>
	<item_groups>
		<item_group>
			<id>1</id>
			<external_id/>
			<name>&#193;&#526;&#718;&#200;&#1477;ъ&#544;&#192;&#658;&#514;&#859;&#352;&#270;&#193;&#192;&#138;&#572;/name>
			<parent_id/>
			<parent_ext_id/>
			<not_show_in_shop>0</not_show_in_shop>
			<index_tree>1:</index_tree>
			<created_date>2016-05-26 15:29:51</created_date>
			<last_update_date>2017-04-20 17:09:03</last_update_date>
		</item_group>
	</item_group>
</root>



Есть часть XML файла хранится на рабочем столе (полный файл объемный сюда его не закинуть, структура такая же), хочу вывести данные на экран в виде таблицы. Использую следующий код:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
USE TaskDB;
GO


DECLARE @XML xml
DECLARE @idoc int
SELECT cast(a as xml) FROM OPENROWSET(BULK N'C:\Users\Пользователь\Desktop\27-04-2021_17-28-11\virtualpos\goodgroups.xml', SINGLE_BLOB) AS A(a)


EXEC sp_xml_preparedocument @idoc output, @XML;


INSERT INTO  item_groups (id,name)
SELECT * FROM OPENXML (@idoc,N'/root/item_groups')
WITH  item_groups;


EXEC sp_xml_removedocument @idoc;
RETURN

Возникает ошибка:  
Сообщение 9420, уровень 16, состояние 1, строка 8
Синтаксический анализ XML: строка 2, символ 123, недопустимый символ 



Я понимаю что ошибка возникает из-за этой строки( <name>ÁȎˎÈׅъȠÀʒȂ͛ŠĎÁÀŠȼ/name>) но таких в документе много.
Что с этим можно сделать? Если дело в кодировке не могу сам понять как достать эти данные либо же их вообще достать нельзя.
...
Рейтинг: 0 / 0
Импорт данных из XML в MS SQL SERVER с помощью openrowset и openxml
    #40069181
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твой XML-файл в кодировке UTF-8.
А это ваще бред
OPENROWSET(BULK N'C:\Users\Пользователь\Desktop\27-04-2021_17-28-11\virtualpos\goodgroups.xml', SINGLE_BLOB) AS A(a)

Какой, нафиг, BLOB?
XML зафсегда был и будет NCLOB.

1. Надо конвертировать UTF-8 в UTF-16.
2. OPENROWSET(BULK N'C:\Users\Пользователь\Desktop\27-04-2021_17-28-11\virtualpos\goodgroups.xml', SINGLE_NCLOB)
...
Рейтинг: 0 / 0
Импорт данных из XML в MS SQL SERVER с помощью openrowset и openxml
    #40069228
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы там не был 1251 с заголовком UTF-8.
...
Рейтинг: 0 / 0
Импорт данных из XML в MS SQL SERVER с помощью openrowset и openxml
    #40069250
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lodry

<name>ÁȎˎÈׅъȠÀʒȂ͛ŠĎÁÀŠȼ/name>)


Владислав Колосов
Как бы там не был 1251 с заголовком UTF-8.


Кракозябрики свидетельствуют за UTF8.
...
Рейтинг: 0 / 0
Импорт данных из XML в MS SQL SERVER с помощью openrowset и openxml
    #40069303
lodry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,
Спасибо за ответ, буду двигаться в этом направлении. (Надо конвертировать UTF-8 в UTF-16) как это можно реализовать? \
Прошу прощения за глупые вопросы, только начинаю осваивать эту стезю.
...
Рейтинг: 0 / 0
Импорт данных из XML в MS SQL SERVER с помощью openrowset и openxml
    #40069363
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lodry
aleks222,
Спасибо за ответ, буду двигаться в этом направлении. (Надо конвертировать UTF-8 в UTF-16) как это можно реализовать? \
Прошу прощения за глупые вопросы, только начинаю осваивать эту стезю.


1. SaveAs в Notepad++ или подобном редакторе.
2. C# или Powershell.
3. Ну а настоящие джигиты, делают так...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
/* 
declare @b as varbinary(max) = 0xD09CD0BED180D0B520D0A2D180D18DD0B2D0B5D0BB2E20D094D09ED09AD0A3D09CD095D09DD0A2D0AB20D094D09BD0AF20D09AD09BD098D095D09DD0A2D09020D0BFD0BE20D182D183D180D1832054523830393230303034;
select * from dbo.[utf8-to-utf16](@b)
*/
ALTER FUNCTION [dbo].[utf8-to-utf16]( @utf8 varbinary(max) )
RETURNS TABLE 
AS
RETURN 
(
with b as ( select b = substring(@utf8, n, 1), n from dbo.N where n between 1 and len(@utf8) )
   , bn as ( select b, n from b where b&128 = 0 or b&224 = 192 or b&240 = 224 or b&248 = 240 )
   , chs as ( select b = case  
                            when b&128 = 0   then      b 
                            when b&224 = 192 then     (b&31) * 64 | ( substring(@utf8, n+1, 1) & 63 ) 
                            when b&240 = 224 then   ( (b&15) * 64 | ( substring(@utf8, n+1, 1) & 63 ) ) * 64 | ( substring(@utf8, n+2, 1) & 63 ) 
                            else                  ( ( (b&07) * 64 | ( substring(@utf8, n+1, 1) & 63 ) ) * 64 | ( substring(@utf8, n+2, 1) & 63 ) ) * 64 | ( substring(@utf8, n+3, 1) & 63 ) 
                         end
                   , n
               from bn
           )
    select utf16 = ( select nchar(b) from chs order by n asc for xml path(''), type ).value('.', 'nvarchar(max)')
)
...
Рейтинг: 0 / 0
Импорт данных из XML в MS SQL SERVER с помощью openrowset и openxml
    #40069392
lodry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,
Спасибо, опробую!
...
Рейтинг: 0 / 0
Импорт данных из XML в MS SQL SERVER с помощью openrowset и openxml
    #40069552
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lodry
aleks222,
Спасибо, опробую!

lodry , так следует поступать, только если действие однократное, или вам в принципе всё равно, сколько это будет выполняться (ну, это один небольшой файл, когда-нибудь ночью, джобом, например).
Если вы будете использовать это массово, и для больших файлов - лучше напишите CLR.
Разница будет на 2-3 порядка. Ну, в 1000 раз вряд-ли, но в несколько сот раз - точно.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Импорт данных из XML в MS SQL SERVER с помощью openrowset и openxml
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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