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

Откуда:
Сообщений: 22
Всем привет.

Наткнулся на такую проблему.
Никак не могу отучить openxml удалять символ перевода каретки '\r'.

Пример :

declare @i int
declare @x xml
declare @res varchar(max)
 
--set @x = '<root><letter_head>1' + char(13) + char(10) + '2</letter_head></root>'
set @x = '<root><letter_head>1
2</letter_head></root>'
 
exec sp_xml_preparedocument @i output, @x
 
set @res = (select * from OpenXML(@i, 'root', 2) with(letter_head varchar(20)))
 
select @res, substring(@res,1,1),substring(@res,2,1),substring(@res,3,1),substring(@res,4,1)
 
union
 
select @res,
cast(unicode(substring(@res,1,1)) as varchar(10)),
cast(unicode(substring(@res,2,1)) as varchar(10)),
cast(unicode(substring(@res,3,1)) as varchar(10)),
cast(unicode(substring(@res,4,1)) as varchar(10))
 
 
set @res = @x.value('(root/letter_head)[1]', 'varchar(max)')
select @res, substring(@res,1,1),substring(@res,2,1),substring(@res,3,1),substring(@res,4,1)
select @res,
cast(unicode(substring(@res,1,1)) as varchar(10)),
cast(unicode(substring(@res,2,1)) as varchar(10)),
cast(unicode(substring(@res,3,1)) as varchar(10)),
cast(unicode(substring(@res,4,1)) as varchar(10))
 
exec sp_xml_removedocument @i
 

Решение я уже нашел - использовать функцию nodes().

А можно ли все таки получить нормальный результат, используя OPENXML?
21 окт 09, 21:06    [7820522]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
HorrorChip
Member

Откуда:
Сообщений: 22
Вначале примера,

set @x = '<root><letter_head>1& #x0d;& #x0a;
2</letter_head></root>'

только нужно удалить пробелы между символом & и #.
21 окт 09, 21:12    [7820531]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
HorrorChip
Member

Откуда:
Сообщений: 22
Наткнулся на ветку с обсуждением того же вопроса, но без решения.

Похоже эта ошибка OPENXML неизлечима.
12 ноя 09, 10:06    [7918206]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
HorrorChip
Member

Откуда:
Сообщений: 22
Ах да!

Ссылка на найденную ветку
12 ноя 09, 10:14    [7918262]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
Glory
Member

Откуда:
Сообщений: 104760
HorrorChip
Наткнулся на ветку с обсуждением того же вопроса, но без решения.

Похоже эта ошибка OPENXML неизлечима.

А вы эксперимент в SMS проводите ? А вывод результата куда поставили ? В Грид ?
12 ноя 09, 11:00    [7918614]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
HorrorChip
Member

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

Именно так.
12 ноя 09, 12:20    [7919320]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
Glory
Member

Откуда:
Сообщений: 104760
HorrorChip
Glory,

Именно так.

Так Грид SMS-а никогда не показывает переводы строк в значениях поля
12 ноя 09, 12:22    [7919342]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
HorrorChip
Member

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

Мой пример определяет отсутсвие данных символов используя ф-цию substring.
В разных ситуациях результат отличается из-за наличия (отсутвия) символов перевода.
12 ноя 09, 12:44    [7919575]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Так Грид SMS-а никогда не показывает переводы строк в значениях поля

так, можно и к varbinary преобразовать, чтобы убедиться, что фокус имеет место.

Posted via ActualForum NNTP Server 1.4

12 ноя 09, 12:48    [7919619]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
Glory
Member

Откуда:
Сообщений: 104760
HorrorChip
Glory,

Мой пример определяет отсутсвие данных символов используя ф-цию substring.
В разных ситуациях результат отличается из-за наличия (отсутвия) символов перевода.

И как же вы разглядели наличие/остуствие символа перевода каретки при выводе результата в Грид ?
12 ноя 09, 12:49    [7919628]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
HorrorChip
Member

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

Изучив/Запустив мой пример (не забыв заменить перенос строки на '& #x0d;& #x0a;' удалив
пробелы как указано во втором моём посте). Вы поймете как я это увидел. :)

Немного модифицировал пример (использовал тип varbinary) (спасибо daw)

declare @i int
declare @x xml
declare @res varchar(max)
 
set @x = '<root><letter_head>1& #x0d;& #x0a;2</letter_head></root>'
 
exec sp_xml_preparedocument @i output, @x
 
set @res = (select * from OpenXML(@i, 'root', 2) with(letter_head varchar(20)))
 
select @res, substring(@res,1,1),substring(@res,2,1),substring(@res,3,1),substring(@res,4,1), cast(@res as varbinary(20))
 
 
 
set @res = @x.value('(root/letter_head)[1]', 'varchar(max)')
select @res, substring(@res,1,1),substring(@res,2,1),substring(@res,3,1),substring(@res,4,1), cast(@res as varbinary(20))

 
exec sp_xml_removedocument @i


P.S.: Не забудьте удалить пробелы между символы '&' и '#' в 5 -й строке!
12 ноя 09, 12:57    [7919717]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
Glory
Member

Откуда:
Сообщений: 104760
При выводе результата в To text я вижу переводы строк во всех трех способах инициализации переменной @x
12 ноя 09, 13:01    [7919756]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
HorrorChip
Member

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

1. Пример настроен на отображение в гриде.
2. В To text посмотрите получше. Во втором случае переводов на один больше ;-)
12 ноя 09, 13:05    [7919825]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
Glory
Member

Откуда:
Сообщений: 104760
HorrorChip
Glory,

1. Пример настроен на отображение в гриде.

Грид SMS-а НЕ отображает переводы строк в значениях ячеек
12 ноя 09, 13:07    [7919846]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

Glory, а чем вас не устраивает пример с преобразованием varbinary?
там ясно видно, что символ с кодом 13 (0x0D) пропадает.

Posted via ActualForum NNTP Server 1.4

12 ноя 09, 13:12    [7919910]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
Glory
Member

Откуда:
Сообщений: 104760
daw

Glory, а чем вас не устраивает пример с преобразованием varbinary?
там ясно видно, что символ с кодом 13 (0x0D) пропадает.

Понимаете, человек публикует код, который по его словам определяет некоторую проблему.
А получается, что в этом коде нужно еще что-то самостоятельно дорабатывать напильником
12 ноя 09, 13:15    [7919945]     Ответить | Цитировать Сообщить модератору
 Re: Как "отучить" OPENXML игнорировать символ переноса каретки  [new]
HorrorChip
Member

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

Вообще то используя перый пример видно, что символ пропадает.
А то что нужно удалять пробелы это следствие того, что без пробелов данная последовательность
символов на форуме преобразовывается в перевод строки.
12 ноя 09, 13:51    [7920344]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить