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

Откуда: Саратов
Сообщений: 44
Преамбула такова:
Есть поле в таблице, куда пользовательское приложение поместило XML - файл целиком. Поле имеет тип IMAGE. (Изменить этот тип на другой - нельзя.)
Задача состоит в том, чтобы распознать содержимое этого XML-файла. (Структура XML файла заранее известна, однако предусмотреть такие сюрпризы, как файл "не той" структуры или "битый" файл, тоже нужно.) В приложении это никак не контролируется и повлиять на него я не могу. Как вытащить данные из поля и поместить их в промежуточные таблицы для последующего анализа? OPENXML - вроде подходит, однако не может почему-то читать данные напрямую из поля которое имеет тип IMAGE.
30 окт 13, 17:52    [15054811]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
P.S. Вариант, когда надо напрямую читать XML-файл средствами SQL из его файловой системы - не предлагать.
30 окт 13, 17:55    [15054828]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
Гость333
Member

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

Версия сервера у вас какая?
30 окт 13, 17:59    [15054845]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
Exproment
Member

Откуда:
Сообщений: 416
BestiA
Поле имеет тип IMAGE. (Изменить этот тип на другой - нельзя

BestiA
В приложении это никак не контролируется и повлиять на него я не могу

"Нельзя/не могу" равно не умею ? Или чему равно ? Зачем записывать в базу битый контент ? Почему нельзя типизировать xml - и если клиент дает вам не ту XML - это проблемы клиента, а не ваши.
30 окт 13, 17:59    [15054849]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
Гость333
BestiA,

Версия сервера у вас какая?


В общем случае, это надо сделать под версию M$-SQL 2005 и выше.
30 окт 13, 18:06    [15054883]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
Exproment,

Приложение, что работает с базой - писалось сторонней организацией. Переписать его я не могу/не умею/не имею права. (нужное подчеркнуть)
30 окт 13, 18:08    [15054899]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
qwerty112
Guest
BestiA
OPENXML - вроде подходит, однако не может почему-то читать данные напрямую из поля которое имеет тип IMAGE.

нуу, наверное потому, что аргумент xmltext у sp_xml_preparedocument =
F1
xmltext is a text parameter: char, nchar, varchar, nvarchar, text, ntext or xml.

---

"прочитайте" значение из IMAGE в переменную varbinary , и попробуйте её привести к xml - set @xml=cast(@bin as xml)
если повезёт (ваше приложение сохраняет в IMAGE НЕ текст в кодировке utf-8), то получите xml, который затем можете разобрать через тот же OPENXML или xquery

если НЕ повезёт - так можно попробовать 14924546
31 окт 13, 10:34    [15056914]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
qwerty112
BestiA
OPENXML - вроде подходит, однако не может почему-то читать данные напрямую из поля которое имеет тип IMAGE.

нуу, наверное потому, что аргумент xmltext у sp_xml_preparedocument =
F1
xmltext is a text parameter: char, nchar, varchar, nvarchar, text, ntext or xml.

---

"прочитайте" значение из IMAGE в переменную varbinary , и попробуйте её привести к xml - set @xml=cast(@bin as xml)
если повезёт (ваше приложение сохраняет в IMAGE НЕ текст в кодировке utf-8), то получите xml, который затем можете разобрать через тот же OPENXML или xquery

если НЕ повезёт - так можно попробовать 14924546


Спасибо, qwerty112! Хоть что-то. На самом деле действительность ещё кошмарнее. Файлы могут попадаться весьма огромными. ~ 20 Mb. Содержимое такого файла считать целиком в переменную varchar не получится.

Написал от безысходности такой вот фрагмент кода для переливки IMAGE в TEXT, но почему-то не работает этот код с большими файлами. Не знаю почему.

  DECLARE @FLen INT,@partsCnt INT,@partsOst INT,@m INT,@cnt INT,@ID INT,@a VARCHAR(8000), @pt varbinary(16);

SET @ID = 1; --<В первой строке таблицы лежит образ XML, объёмом ~20 Мб.   

SELECT TOP 1 @FLen = DATALENGTH (t.A_FILE) FROM TestTable1 t WHERE t.[ID] = @ID;

SET @m = 8000;
SET @cnt = 0;
SET @partsCnt = @FLen / @m ;
SET @partsOst = @FLen % @m ;

INSERT INTO TestTable2 ([TEXT]) VALUES('');
SELECT @pt = TEXTPTR([TEXT]) FROM TestTable2;
WHILE @cnt <= @partsCnt*@m+@partsOst
BEGIN
	IF @cnt > @partsCnt * @m SET @m = @partsOst ;  
	SELECT @a = CAST(SUBSTRING(TestTable1.A_FILE,@cnt,@m) AS VARCHAR(8000)) FROM TestTable1 WHERE [ID] = @ID
	UPDATETEXT TestTable2.[TEXT] @pt NULL 0 @a
	SET @cnt = @cnt + @m;
END;

SELECT [TEXT],DATALENGTH ([TEXT]) AS [len] FROM TestTable2   
31 окт 13, 14:50    [15058994]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
PS
CREATE TABLE TestTable1 ([ID] INT IDENTITY, [A_FILE] IMAGE) -- исходная таблица
CREATE TABLE TestTable2 ([ID] INT IDENTITY, [Text] IMAGE) -- целевая таблица
31 окт 13, 14:51    [15059003]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
Glory
Member

Откуда:
Сообщений: 104760
BestiA
Спасибо, qwerty112! Хоть что-то. На самом деле действительность ещё кошмарнее. Файлы могут попадаться весьма огромными. ~ 20 Mb. Содержимое такого файла считать целиком в переменную varchar не получится.

Чего это вдруг ? varchar(max) отменили ?
31 окт 13, 15:02    [15059068]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
Гость333
Member

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

Начиная с MSSQL 2005, вместо типов данных text, ntext, image рекомендуется применять varchar(max), nvarchar(max), varbinary(max) соответственно. Поэтому разбиение текста на 8000 символов, добыча TEXTPTR из таблицы, и прочие приседания давно уже не нужны.
31 окт 13, 15:28    [15059207]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
Glory
BestiA
Спасибо, qwerty112! Хоть что-то. На самом деле действительность ещё кошмарнее. Файлы могут попадаться весьма огромными. ~ 20 Mb. Содержимое такого файла считать целиком в переменную varchar не получится.

Чего это вдруг ? varchar(max) отменили ?


Если бы так можно было... ^_^

INSERT INTO TestTable2 ([TEXT]) SELECT CAST(A_FILE AS VARCHAR(MAX)) AS [TEXT] FROM TestTable1 WHERE [ID] = 1



Сообщение 529, уровень 16, состояние 2, строка 1
Explicit conversion from data type image to varchar(max) is not allowed.
31 окт 13, 15:51    [15059365]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
Гость333, Если бы там можно было сделать - я бы не заморачивался. Нельзя.
31 окт 13, 15:54    [15059385]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
create table #t (i image);
insert #t(i) values(0x48656C6C6F20776F726C6421);
select cast(cast(i as varbinary(max)) as varchar(max)) as txt from #t;
drop table #t;
31 окт 13, 15:58    [15059410]     Ответить | Цитировать Сообщить модератору
 Re: Необходимо достать и распознать XML, образ которого лежит в поле типа IMAGE  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
Гость333
create table #t (i image);
insert #t(i) values(0x48656C6C6F20776F726C6421);
select cast(cast(i as varbinary(max)) as varchar(max)) as txt from #t;
drop table #t;


Спасибо. То, что надо!
31 окт 13, 17:12    [15060053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить