Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / загрузка xml / 25 сообщений из 25, страница 1 из 1
06.10.2008, 14:27
    #35578177
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Нужна помощь!

загружаю 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],

Подскажите, как исправить ошибку, как правильно выгрузить данные?
...
Рейтинг: 0 / 0
06.10.2008, 14:51
    #35578265
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
А файл в какой кодировке ? А какой encoding указан в нем ?
...
Рейтинг: 0 / 0
06.10.2008, 15:02
    #35578307
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
<?xml version="1.0" encoding="utf-8"?>
...
Рейтинг: 0 / 0
17.10.2008, 10:55
    #35600193
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
ребят помогите пожалуйста, проблема осталась...
хоть какие-нибудь идеи...
...
Рейтинг: 0 / 0
17.10.2008, 10:56
    #35600199
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Bruin_Baluребят помогите пожалуйста, проблема осталась...
хоть какие-нибудь идеи...
А на вопросы ответите ?
...
Рейтинг: 0 / 0
17.10.2008, 10:58
    #35600208
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Bruin_Balu<?xml version="1.0" encoding="utf-8"?>

вроде такая кодировка, или Вы что-то другое имеете ввиду?
...
Рейтинг: 0 / 0
17.10.2008, 10:59
    #35600212
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Bruin_BaluBruin_Balu<?xml version="1.0" encoding="utf-8"?>

вроде такая кодировка, или Вы что-то другое имеете ввиду?
Вопроса было два
А файл в какой кодировке ?
А какой encoding указан в нем ?
Вы ответили на второй
...
Рейтинг: 0 / 0
17.10.2008, 11:10
    #35600257
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
хм... затрудняюсь ответить на Ваш вопрос... файл я скачиваю с 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>

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

Как определить кодировку файла?
...
Рейтинг: 0 / 0
17.10.2008, 11:14
    #35600272
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Если открыть файл в Notepad, выбрать Save as то какое значение будет в Encoding ?
...
Рейтинг: 0 / 0
17.10.2008, 11:17
    #35600290
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
UTF-8
...
Рейтинг: 0 / 0
17.10.2008, 11:29
    #35600339
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Bruin_BaluUTF-8
И как и куда именно вы загружаете этот файл в MSSQL ?
...
Рейтинг: 0 / 0
17.10.2008, 12:03
    #35600440
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
данные вставляю в таблицу
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
...
Рейтинг: 0 / 0
17.10.2008, 12:08
    #35600454
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
А почему SINGLE_CLOB, если у вас кодировка UTF8 ?
...
Рейтинг: 0 / 0
17.10.2008, 12:19
    #35600496
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
если поставить SINGLE_NCLOB пишет: SINGLE_NCLOB requires a UNICODE (widechar) input file. The file specified is not Unicode.
...
Рейтинг: 0 / 0
17.10.2008, 12:22
    #35600509
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Bruin_Baluесли поставить SINGLE_NCLOB пишет: SINGLE_NCLOB requires a UNICODE (widechar) input file. The file specified is not Unicode.
Тогда придется файл записывать в ANSI кодировке.
...
Рейтинг: 0 / 0
17.10.2008, 12:24
    #35600514
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Bruin_Balu,
а теперь открываем FAR по F4 файл и смотрим..... скорее всего файл таки не в юникоде, сие ві сразу увидите
...
Рейтинг: 0 / 0
17.10.2008, 15:21
    #35601250
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
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
...
Рейтинг: 0 / 0
17.10.2008, 15:24
    #35601255
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
<B>text2 <B>
...
Рейтинг: 0 / 0
17.10.2008, 15:33
    #35601283
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
ага, прошу прощения:

<?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) то выгружается корректно...
...
Рейтинг: 0 / 0
17.10.2008, 15:34
    #35601292
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
MniorBruin_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:
Код: plaintext
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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
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
Работает на ура.
...
Рейтинг: 0 / 0
17.10.2008, 15:37
    #35601304
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Принты забыл убрать.
...
Рейтинг: 0 / 0
17.10.2008, 15:45
    #35601335
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Mnior, действительно, работает на ура!
только мне до сих пор непонятно чем мой метод был плох?
...
Рейтинг: 0 / 0
17.10.2008, 15:47
    #35601342
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Bruin_BaluMnior, действительно, работает на ура!
только мне до сих пор непонятно чем мой метод был плох?
Тем, что "SQL Server 2005 stores XML data using the UTF-16 encoding scheme."
...
Рейтинг: 0 / 0
17.10.2008, 15:50
    #35601352
Bruin_Balu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Огромное всем спасибо за помощь!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
28.05.2019, 11:46
    #39819178
le7els
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка xml
Mnior, добрый день. Передо мной стоит такая же задача загрузить xml-файл в таблицу. Реализация через sp_OACreate как и у вас, но возникли проблемы. Не нашел на форуме как я могу к вам в личку написать.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / загрузка xml / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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