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

Откуда:
Сообщений: 10398
Здравствуйте!
При выполнении следующего запроса возникает ошибка

			SELECT
			-- dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E') AS col1
			--, tp.tpar_value	AS col_wrong		      
			CASE
					WHEN 9 = 20 THEN dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E')
					ELSE tp.tpar_value
		        END AS col_wrong		      
			FROM TaskParams AS tp				
			WHERE
				 tp.tpar_id = '1E71F5C6-2994-4653-9849-DE0C887CD708'
			FOR XML PATH('item'), TYPE


XML parsing: line 1, character 28, semicolon expected

Следующий запрос выполняется

			SELECT
			 dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E') AS col1
			, tp.tpar_value	AS col_wrong		      
			 --CASE
				--	WHEN 9 = 20 THEN dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E')
				--	ELSE tp.tpar_value
		        --    END AS col_wrong		      
			FROM TaskParams AS tp				
			WHERE
				 tp.tpar_id = '1E71F5C6-2994-4653-9849-DE0C887CD708'
			FOR XML PATH('item'), TYPE


<item>
  <col_wrong>1С:Документооборот text&amp;text</col_wrong>
</item>


текст [fnGetComboParam] следующий:
ALTER FUNCTION [dbo].[fnGetComboParam]
(
	@tptype_id UNIQUEIDENTIFIER
)
RETURNS XML 
AS
BEGIN
	RETURN (
		SELECT [@name] = tpv.tpval_name, [@desc] = tpv.tpval_desc
		FROM TaskParamValues AS tpv
		WHERE tpv.tpval_tptype = @tptype_id
		ORDER BY tpv.tpval_order, tpv.tpval_name
		FOR XML PATH('item'), TYPE
		)
END


Ошибку первого запроса удается починить:
1) удалив закодированный амперсант '&' из текста
<item>
  <col_wrong>1С:Документооборот texttext</col_wrong>
</item>


2) либо так:
	SELECT
			-- dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E') AS col1
			--, tp.tpar_value	AS col_wrong		      
			 CASE
					WHEN 9 = 20 THEN dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E')
					ELSE 'Good' --tp.tpar_value
		      END AS col_wrong
			FROM TaskParams AS tp				
			WHERE
				 tp.tpar_id = '1E71F5C6-2994-4653-9849-DE0C887CD708'
			FOR XML PATH('item'), TYPE


<item>
  <col_wrong>Good</col_wrong>
</item>


3) либо, что для меня очень странно, так:
			SELECT
			-- dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E') AS col1
			--, tp.tpar_value	AS col_wrong		      
			 CASE
					WHEN 9 = 20 THEN 'o_O' --dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E')
					ELSE tp.tpar_value
		      END AS col_wrong
			FROM TaskParams AS tp				
			WHERE
				 tp.tpar_id = '1E71F5C6-2994-4653-9849-DE0C887CD708'
			FOR XML PATH('item'), TYPE

<item>
  <col_wrong>1С:Документооборот text&amp;text</col_wrong>
</item>


Воспроизводится на:
Microsoft SQL Server 2012 - 11.0.5058.0 (X64) May 14 2014 18:34:29 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: )
Microsoft SQL Server 2008 (SP3) - 10.0.5520.0 (X64) Jul 11 2014 16:11:50 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Почему первый запрос не выполняется?
Спасибо.
1 июл 15, 10:40    [17836270]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
Ошибку первого запроса удается починить:

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

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
Ошибку первого запроса удается починить:

О чем тогда тема ?

Зарплата и интерес в основном.


подробно:
да просто интересно, почему он не работает, все равно отпуск скоро, пусть коллеги разребают

боевой запрос гораздо больше, вместо 9, переменная
видимо fnGetComboParam иногда должно что то возвращать)
1 июл 15, 10:47    [17836308]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
да просто интересно, почему он не работает,

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

Откуда:
Сообщений: 10398
MSSQLAndDotNet
Glory
пропущено...

О чем тогда тема ?

Зарплата и интерес в основном.


подробно:
да просто интересно, почему он не работает, все равно отпуск скоро, пусть коллеги разребают

боевой запрос гораздо больше, вместо 9, переменная
видимо fnGetComboParam иногда должно что то возвращать)

извиняюсь, падеж неправильно поставил:

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

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
да просто интересно, почему он не работает,

Потому что "line 1, character 28, semicolon expected"

Понятно, спасибо.

Пока не закрывайте тему плиз.
1 июл 15, 10:51    [17836343]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
Понятно, спасибо.

До конечно.
Все потому, что вы считаете, что все части запроса выполняются в строгом порядке. Который вы сами придумали
1 июл 15, 10:53    [17836358]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
Понятно, спасибо.

До конечно.
Все потому, что вы считаете, что все части запроса выполняются в строгом порядке. Который вы сами придумали

где почитать о порядке?
1 июл 15, 11:02    [17836417]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
где почитать о порядке?

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

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
где почитать о порядке?

В плане выполнения ваших запросов


одинаковый план для такого кейса
               CASE
					WHEN 9 = 20 THEN dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E')
					ELSE 'Good' --tp.tpar_value
		      END AS col_wrong


и такого

               CASE
					WHEN 9 = 20 THEN 'ddd' --dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E')
					ELSE 'Good' --tp.tpar_value
		      END AS col_wrong


:(

Т.е ошибка связана с амперсантом, прокладкой, и fnGetComboParam.
1 июл 15, 11:26    [17836580]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
такой вариант тож не работает
ALTER FUNCTION [dbo].[fnGetComboParam]
(
	@tptype_id UNIQUEIDENTIFIER
)
RETURNS XML 
AS
BEGIN
	RETURN ISNULL((
		SELECT [@name] = tpv.tpval_name, [@desc] = tpv.tpval_desc
		FROM TaskParamValues AS tpv
		WHERE tpv.tpval_tptype = @tptype_id
		ORDER BY tpv.tpval_order, tpv.tpval_name
		FOR XML PATH('item'), TYPE), 'ddd'
		)
END
1 июл 15, 11:28    [17836601]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
а вот так работает
ALTER FUNCTION [dbo].[fnGetComboParam]
(
@tptype_id UNIQUEIDENTIFIER
)
RETURNS VARCHAR
AS
BEGIN
RETURN 'ddd'
END
1 июл 15, 11:31    [17836627]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
Т.е ошибка связана с амперсантом, прокладкой, и fnGetComboParam.

Ну так вот и генерируйте валидный xml
1 июл 15, 11:32    [17836642]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
Т.е ошибка связана с амперсантом, прокладкой, и fnGetComboParam.

Ну так вот и генерируйте валидный xml


так нормально?

ALTER FUNCTION [dbo].[fnGetComboParam]
(
	@tptype_id UNIQUEIDENTIFIER
)
RETURNS NVARCHAR(MAX) 
AS
BEGIN
	RETURN CAST((
		SELECT [@name] = tpv.tpval_name, [@desc] = tpv.tpval_desc
		FROM TaskParamValues AS tpv
		WHERE tpv.tpval_tptype = @tptype_id
		ORDER BY tpv.tpval_order, tpv.tpval_name
		FOR XML PATH('item'), TYPE) AS NVARCHAR(MAX))
		
END
1 июл 15, 11:33    [17836647]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
так нормально?

Вы приглашаете меня потестировать вашу функцию ?
1 июл 15, 11:36    [17836665]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
Т.е ошибка связана с амперсантом, прокладкой, и fnGetComboParam.

Ну так вот и генерируйте валидный xml

а пустое значение -разве не валидный XML?
1 июл 15, 11:36    [17836667]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
а пустое значение -разве не валидный XML?

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

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
а пустое значение -разве не валидный XML?

Кому и кобыла - невеста.


вот валидный XML, все равно не работает.

<item>ddd</item>


ALTER FUNCTION [dbo].[fnGetComboParam]
(
@tptype_id UNIQUEIDENTIFIER
)
RETURNS XML
AS
BEGIN
RETURN '<item>ddd</item>'
END


Ладно, надо читать как сиквел стряпает xml, пока что все равно не понял что не правильно делал

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

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
так нормально?

Вы приглашаете меня потестировать вашу функцию ?

я имел ввиду тип возвращаемого зн-я
1 июл 15, 11:45    [17836742]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Ваша проблема в выражении
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, 11:45    [17836743]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
Glory
пропущено...

Вы приглашаете меня потестировать вашу функцию ?

я имел ввиду тип возвращаемого зн-я

Вам бы надо начать с азов
Например с того, какой тип данных возвращает CASE
1 июл 15, 11:46    [17836756]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
3. XML
27. VARCHAR

автор
Returns the highest precedence type from the set of types in result_expressions and the optional else_result_expression


https://msdn.microsoft.com/ru-ru/library/ms190309(v=sql.120).aspx

	 CASE
					WHEN 9 = 20 THEN CAST(dbo.fnGetComboParam('F081C895-6650-4528-8564-D9EE7BF23E0E') AS VARCHAR)
					ELSE tp.tpar_value 
		     END AS col_wrong


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

Откуда:
Сообщений: 10398
А как лучше, хранимкой вернуть VARCHAR
или в кейсах привести?
1 июл 15, 12:19    [17837056]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
или экранировать в tpar_value ?
1 июл 15, 12:27    [17837114]     Ответить | Цитировать Сообщить модератору
 Re: XQuery. Ошибка. XML parsing: line 1, character 28, semicolon expected  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
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;
1 июл 15, 12:38    [17837185]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить