Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
invm
MSSQLAndDotNet
А как лучше, хранимкой вернуть VARCHAR
или в кейсах привести?
MSSQLAndDotNet
или экранировать в tpar_value ?
Вам что ли все равно какой результат получать?
Сравнивайте и разбирайтесь:
declare @x xml = '<x>1</x>', @s varchar(100) ='&';

select
 case when 1 = 0 then @x else (select @s for xml path('')) end as col_wrong
for xml path('a'), type;

select
 case when 1 = 0 then cast(@x as varchar(100)) else @s end as col_wrong
for xml path('a'), type;

select
 case when 1 = 1 then @x else (select @s for xml path('')) end as col_wrong
for xml path('a'), type;

select
 case when 1 = 1 then cast(@x as varchar(100)) else @s end as col_wrong
for xml path('a'), type;

ok
1 июл 15, 13:25    [17837635]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
invm
Ваша проблема в выражении
CASE
					WHEN 9 = 20 THEN dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E')
					ELSE tp.tpar_value
		        END AS col_wrong
Оно имеет тип xml. Поэтому tp.tpar_value приводится к xml.
А т.к. приводимое значение содержит неэкранированные спецсимволы xml - получаете ошибку.


& -> &

разве это не экранирование?
а как еще экранировать?
1 июл 15, 13:28    [17837665]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
MSSQLAndDotNet
& -> &

разве это не экранирование?
а как еще экранировать?

Десь так
Или вот так
1 июл 15, 13:38    [17837774]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
MSSQLAndDotNet
invm
Ваша проблема в выражении
CASE
					WHEN 9 = 20 THEN dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E')
					ELSE tp.tpar_value
		        END AS col_wrong
Оно имеет тип xml. Поэтому tp.tpar_value приводится к xml.
А т.к. приводимое значение содержит неэкранированные спецсимволы xml - получаете ошибку.


& -> &

разве это не экранирование?
а как еще экранировать?


преобразование & в
&amp;
1 июл 15, 13:39    [17837784]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
MSSQLAndDotNet
а как еще экранировать?
Я вам уже показывал в примере.
В вашем случае можно так:
(select tp.tpar_value for xml path(''), type)
1 июл 15, 13:45    [17837830]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
invm
MSSQLAndDotNet
а как еще экранировать?
Я вам уже показывал в примере.
В вашем случае можно так:
(select tp.tpar_value for xml path(''), type)

Спасибо за советы.
Хорошо что не стал преобразовывать XML TO VARCHAR(MAX)
символы экранируются
а клиент то об этом не знает
1 июл 15, 14:30    [17838165]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Почему в этом запросе угловые скобки не экранируются
select CAST(CAST(N'<g/>' as XML) as NVARCHAR(MAX))


а в этом экранируются?
declare @x xml = '<x>1</x>', @s varchar(100) ='&';
select
 case when 1 = 1 then cast(@x as varchar(100)) 
 else @s end as col_wrong
for xml path('a'), type;


<a>
  <col_wrong>&lt;x&gt;1&lt;/x&gt;</col_wrong>
</a>
1 июл 15, 14:52    [17838346]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
MSSQLAndDotNet
Почему в этом запросе угловые скобки не экранируются
select CAST(CAST(N'<g/>' as XML) as NVARCHAR(MAX))


а в этом экранируются?
declare @x xml = '<x>1</x>', @s varchar(100) ='&';
select
 case when 1 = 1 then cast(@x as varchar(100)) 
 else @s end as col_wrong
for xml path('a'), type;


<a>
  <col_wrong>&lt;x&gt;1&lt;/x&gt;</col_wrong>
</a>

и там и там вроде XML к VARCHAR,NVARCHAR приводится
1 июл 15, 14:58    [17838404]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
Почувствуйте разницу:
declare @x xml = '<x>1</x>', @s varchar(100) ='&';

select
 case when 1 = 1 then cast(@x as varchar(100)) 
 else @s end as col_wrong
for xml path('a'), type;

select
 case when 1 = 1 then cast(@x as varchar(100)) 
 else @s end as col_wrong
--for xml path('a'), type;
1 июл 15, 15:09    [17838511]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
invm
Почувствуйте разницу:
declare @x xml = '<x>1</x>', @s varchar(100) ='&';

select
 case when 1 = 1 then cast(@x as varchar(100)) 
 else @s end as col_wrong
for xml path('a'), type;

select
 case when 1 = 1 then cast(@x as varchar(100)) 
 else @s end as col_wrong
--for xml path('a'), type;

написав type мы привели к XML
1 июл 15, 15:41    [17838724]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
MSSQLAndDotNet
invm
Почувствуйте разницу:
declare @x xml = '<x>1</x>', @s varchar(100) ='&';

select
 case when 1 = 1 then cast(@x as varchar(100)) 
 else @s end as col_wrong
for xml path('a'), type;

select
 case when 1 = 1 then cast(@x as varchar(100)) 
 else @s end as col_wrong
--for xml path('a'), type;

написав type мы привели к XML

не, не то
в таком случае эти запросы должны дать одинаковый результат

declare @x xml = '<x>1</x>', @s varchar(100) ='& ';
			
select cast(cast(@x as varchar(100)) AS XML)

select
 case when 1 = 1 then cast(@x as varchar(100)) 
 else @s end 
for xml path(''), type;
1 июл 15, 16:10    [17838875]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Чет я совсем запутался

правильно ли утверждение?

for xml path() экранирует символы,
а приведение XML to VARCHAR и наоборот экранированием не производит.
1 июл 15, 16:15    [17838896]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
MSSQLAndDotNet
Чет я совсем запутался

правильно ли утверждение?

for xml path() экранирует символы,
а приведение XML to VARCHAR и наоборот экранированием не производит.

поправил
1 июл 15, 16:17    [17838916]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Итог:

declare  @x XML ='<d>f</d>';
SELECT @x -- не экранируются
SELECT CAST( cast('<d>f</d>' AS VARCHAR(MAX)) AS XML) -- не экранируются, при приведении типов в любом направлении ничего не экранируется
SELECT @x for xml path(''); -- не экранируются, т.к исходный тип XML
SELECT CAST(@x AS NVARCHAR(MAX)) for xml path(''), TYPE; -- экранируется, т.к. исходный тип - строковый

Внимание, вопрос:
здесь
https://msdn.microsoft.com/ru-ru/library/bb500235(v=sql.120).aspx
написано
автор
SQL Server преобразует недопустимые XML-символы в сущности, когда они возвращаются в запросах FOR XML, не содержащих директивы TYPE.


в моем случае
SELECT CAST(@x AS NVARCHAR(MAX)) for xml path(''), TYPE;

&lt;d&gt;f&lt;/d&gt;

for xml содержит диррективу TYPE
а символы экранируются
Почему так?
1 июл 15, 16:55    [17839125]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
MSSQLAndDotNet
Почему так?
Потому что деректива for xml обеспечивает выдачу валидного xml, вне зависимости от наличия/отсутствия дерективы type.
В валидном xml спецсимволы должны быть экранированы.

А в документации всегда были, есть и будут ошибки.
1 июл 15, 17:16    [17839269]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

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

Вопрос снят.
1 июл 15, 17:34    [17839389]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить