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

Откуда:
Сообщений: 112
Нужна помощь!

загружаю xml файл в таблицу. В файле есть данные такого типа:

<docno>БРн-057</docno>
<currencycode>Рубль</currencycode>
<comment>Расходная накладная №БРн-057 от 25.10</comment>

которые загружаться не хотят (illegal xml character)

код, который загружает эти элементы:

isnull(t.rows.value('docno[1]','nvarchar(255)'),'') as [docno],
isnull(t.rows.value('currencycode[1]','nvarchar(255)'),'') as [currencycode],

Подскажите, как исправить ошибку, как правильно выгрузить данные?
6 окт 08, 14:27    [6269501]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
А файл в какой кодировке ? А какой encoding указан в нем ?

Сообщение было отредактировано: 6 окт 08, 14:51
6 окт 08, 14:51    [6269661]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Bruin_Balu
Member

Откуда:
Сообщений: 112
<?xml version="1.0" encoding="utf-8"?>
6 окт 08, 15:02    [6269726]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Bruin_Balu
Member

Откуда:
Сообщений: 112
ребят помогите пожалуйста, проблема осталась...
хоть какие-нибудь идеи...
17 окт 08, 10:55    [6319472]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bruin_Balu
ребят помогите пожалуйста, проблема осталась...
хоть какие-нибудь идеи...

А на вопросы ответите ?
17 окт 08, 10:56    [6319489]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Bruin_Balu
Member

Откуда:
Сообщений: 112
Bruin_Balu
<?xml version="1.0" encoding="utf-8"?>


вроде такая кодировка, или Вы что-то другое имеете ввиду?
17 окт 08, 10:58    [6319512]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bruin_Balu
Bruin_Balu
<?xml version="1.0" encoding="utf-8"?>


вроде такая кодировка, или Вы что-то другое имеете ввиду?

Вопроса было два
А файл в какой кодировке ?
А какой encoding указан в нем ?
Вы ответили на второй
17 окт 08, 10:59    [6319519]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Bruin_Balu
Member

Откуда:
Сообщений: 112
хм... затрудняюсь ответить на Ваш вопрос... файл я скачиваю с FTP в таком виде:

<?xml version="1.0" encoding="utf-8"?>
<docs>
<doc>
<A>text1</A>
<B>text2<B>
<C>2008-10-17</C>
<docno>БРн-015</docno>
<comment>Расходная накладная №БРн-057 от 25.10</comment>
<currencycode>Рубль</currencycode>
<D>1</D>
</doc>
</docs>


задача загрузить эти данные в реляционные таблицы (MS SQL Server 2005)...
не загружаются только эти данные

<docno>БРн-015</docno>
<comment>Расходная накладная №БРн-057 от 25.10</comment>
<currencycode>Рубль</currencycode>

т.е. если их "руками" удалить из файла, все остальное в таблицу загрузится корректно.

Как определить кодировку файла?
17 окт 08, 11:10    [6319627]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
Если открыть файл в Notepad, выбрать Save as то какое значение будет в Encoding ?
17 окт 08, 11:14    [6319668]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Bruin_Balu
Member

Откуда:
Сообщений: 112
UTF-8
17 окт 08, 11:17    [6319707]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bruin_Balu
UTF-8

И как и куда именно вы загружаете этот файл в MSSQL ?
17 окт 08, 11:29    [6319850]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Bruin_Balu
Member

Откуда:
Сообщений: 112
данные вставляю в таблицу
USE [Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[test_table](
[A] [nvarchar](max) NULL,
[B] [nvarchar](max) NULL,
[C] [nvarchar](max) NULL,
[docno] [nvarchar](max) NULL,
[currencycode] [nvarchar](max) NULL,
[comment] [nvarchar](max) NULL,
[D] [nvarchar](max) NULL
) ON [PRIMARY]

примерно так:

declare @FilePath nvarchar(250)
set @FilePath= ''
declare @SQLString nvarchar(2000)
declare @xml xml

set @SQLString='select @xml_out = (SELECT dxml.* FROM OPENROWSET(BULK N'''+@FilePath+''', SINGLE_CLOB) as dxml )'

exec sp_executesql @SQLString,N'@xml_out xml output', @xml_out = @xml output

if object_id(N'tempdb..#xml ') is not null drop table #xml
select

isnull(t.rows.value('(A)[1]','nvarchar(MAX)'),'') as [A],
isnull(t.rows.value('(B)[1]','nvarchar(MAX)'),'') as [B],
isnull(t.rows.value('(C)[1]','nvarchar(MAX)'),'') as [C],
isnull(t.rows.value('(docno)[1]','nvarchar(MAX)'),'') as [docno],
isnull(t.rows.value('(currencycode)[1]','nvarchar(MAX)'),'') as [currencycode],
isnull(t.rows.value('(comment)[1]','nvarchar(MAX)'),'') as [comment],
isnull(t.rows.value('(D)[1]','nvarchar(MAX)'),'') as [D],
into #xml
from @xml.nodes('/docs/doc') as t(rows)

Insert into [test].[dbo].[test_table]
select * from #xml
17 окт 08, 12:03    [6320196]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
А почему SINGLE_CLOB, если у вас кодировка UTF8 ?
17 окт 08, 12:08    [6320251]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Bruin_Balu
Member

Откуда:
Сообщений: 112
если поставить SINGLE_NCLOB пишет: SINGLE_NCLOB requires a UNICODE (widechar) input file. The file specified is not Unicode.
17 окт 08, 12:19    [6320348]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bruin_Balu
если поставить SINGLE_NCLOB пишет: SINGLE_NCLOB requires a UNICODE (widechar) input file. The file specified is not Unicode.

Тогда придется файл записывать в ANSI кодировке.
17 окт 08, 12:22    [6320381]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Bruin_Balu,
а теперь открываем FAR по F4 файл и смотрим..... скорее всего файл таки не в юникоде, сие ві сразу увидите
17 окт 08, 12:24    [6320399]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Bruin_Balu
если поставить SINGLE_NCLOB пишет: SINGLE_NCLOB requires a UNICODE (widechar) input file. The file specified is not Unicode.

А если поставить SINGLE_CLOB то: XML parsing: line 11, character 6, end tag does not match start tag
17 окт 08, 15:21    [6322206]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
<B>text2<B>
17 окт 08, 15:24    [6322217]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Bruin_Balu
Member

Откуда:
Сообщений: 112
ага, прошу прощения:

<?xml version="1.0" encoding="utf-8"?>
<docs>
<doc>
<A>text1</A>
<B>text2</B>
<C>2008-10-17</C>
<docno>БРн-015</docno>
<comment>Расходная накладная №БРн-057 от 25.10</comment>
<currencycode>Рубль</currencycode>
<D>1</D>
</doc>
</docs>

не загружаются только русские символы. Дело не базе: для теста достаточно проверить этот код:
declare @FilePath nvarchar(250)
set @FilePath= ''
declare @SQLString nvarchar(2000)
declare @xml xml

set @SQLString='select @xml_out = (SELECT dxml.* FROM OPENROWSET(BULK N'''+@FilePath+''', SINGLE_CLOB) as dxml )'

exec sp_executesql @SQLString,N'@xml_out xml output', @xml_out = @xml output


кодировка точно UTF-8
Если пересохранить этот файл в формат Unicode и удалить encoding="utf-8" (поменять еще в коде на SINGLE_NCLOB) то выгружается корректно...
17 окт 08, 15:33    [6322294]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
Bruin_Balu
если поставить SINGLE_NCLOB пишет: SINGLE_NCLOB requires a UNICODE (widechar) input file. The file specified is not Unicode.

А если поставить SINGLE_CLOB то: XML parsing: line 11, character 6, end tag does not match start tag
А вот через sp_OACreate:
DECLARE	 @OLEStream	Int
	,@File		SysName
	,@EOF		Bit
	,@Response	NVarChar(max)
	,@ErrCode	Int
	,@ErrMethod	SysName
	,@ErrSource	SysName
	,@ErrDescript	SysName

SELECT	 @File		= '<FilePath>'
	,@Response	= ''

EXEC @ErrCode = sys.sp_OACreate 'ADODB.Stream' ,@OLEStream OUT
IF (@ErrCode != 0)
	SELECT	 @ErrMethod	= 'ADODB.Stream'
		,@ErrSource	= 'sp_OACreate'
		,@ErrDescript	= 'Ошибка создания OLE объекта'
ELSE BEGIN
	EXEC @ErrCode = sys.sp_OAMethod @OLEStream ,'Open'							IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'Open'		GOTO StreamError END
	EXEC @ErrCode = sys.sp_OASetProperty @OLEStream ,'CharSet' ,'utf-8'					IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'CharSet'		GOTO StreamError END
	EXEC @ErrCode = sys.sp_OAMethod @OLEStream ,'LoadFromFile' ,NULL, @File					IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'LoadFromFile'	GOTO StreamError END
	-- Для обхода "особенности" чтения utf-8
	EXEC @ErrCode = sys.sp_OAMethod @OLEStream ,'ReadText' ,@ErrDescript OUT, 2				IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'ReadText'		GOTO StreamError END
PRINT	1
	-- Рекурсивное порциальное чтение
	WHILE (1 = 1) BEGIN
PRINT	0
		-- Проверка достижения конца файла
		EXEC @ErrCode = sys.sp_OAGetProperty @OLEStream ,'EOS' ,@EOF OUT				IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'EOS'			GOTO StreamError END
		IF (@EOF = 1) BREAK
		-- Чтение очережной порции
		EXEC @ErrCode = sys.sp_OAMethod @OLEStream ,'ReadText' ,@ErrDescript OUT, 128			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'ReadText'		GOTO StreamError END
		SET @Response = @Response + @ErrDescript
	END
	-- Закрытие Stream
	EXEC @ErrCode = sys.sp_OAMethod @OLEStream ,'Close'							IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'Close'		GOTO StreamError END
	-- Уничтожение Stream
	GOTO StreamDestroy
	StreamError:	EXEC @ErrCode = sys.sp_OAGetErrorInfo @OLEStream ,@ErrSource OUT ,@ErrDescript OUT
	StreamDestroy:	EXEC @ErrCode = sys.sp_OADestroy @OLEStream
END
-- Вывод ошибок
IF (@ErrSource IS NOT NULL)
	RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s',18,1,@ErrMethod,@ErrSource,@ErrDescript)
ELSE
	SELECT	@Response
Работает на ура.
17 окт 08, 15:34    [6322306]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Принты забыл убрать.
17 окт 08, 15:37    [6322343]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Bruin_Balu
Member

Откуда:
Сообщений: 112
Mnior, действительно, работает на ура!
только мне до сих пор непонятно чем мой метод был плох?
17 окт 08, 15:45    [6322407]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
Bruin_Balu
Mnior, действительно, работает на ура!
только мне до сих пор непонятно чем мой метод был плох?

Тем, что "SQL Server 2005 stores XML data using the UTF-16 encoding scheme."
17 окт 08, 15:47    [6322423]     Ответить | Цитировать Сообщить модератору
 Re: загрузка xml  [new]
Bruin_Balu
Member

Откуда:
Сообщений: 112
Огромное всем спасибо за помощь!
17 окт 08, 15:50    [6322455]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: загрузка xml  [new]
le7els
Member

Откуда:
Сообщений: 6
Mnior, добрый день. Передо мной стоит такая же задача загрузить xml-файл в таблицу. Реализация через sp_OACreate как и у вас, но возникли проблемы. Не нашел на форуме как я могу к вам в личку написать.
28 май 19, 11:46    [21895507]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить