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

Откуда:
Сообщений: 283
Добрый день, уважаемые знатоки sql.
есть такой скрипт:

DECLARE @xml NVARCHAR(MAX)
SET @xml =
N'<XML>
	<ITEM>		
		<Value1>высшее </Value1>
		<Value2>среднее специальное</Value2>
	</ITEM>
</XML>'
DECLARE @hdoc INT	
EXEC SP_XML_PREPAREDOCUMENT @hdoc OUTPUT, @xml OUTPUT

SELECT * FROM OPENXML(@hdoc, '//XML/ITEM') WITH
(		
	Value1 SQL_VARIANT 'Value1',
	Value2 VARCHAR(2000) 'Value2'
)
	
EXEC SP_XML_REMOVEDOCUMENT @hdoc 


Почему то значение ноды Value1 парсится как 'высшее', но почему там же в конце еще есть пробел, должно быть так же 'высшее '
В чем проблема, как ее можно исправить?
Спасибо
3 май 12, 10:33    [12499257]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
Glory
Member

Откуда:
Сообщений: 104751
Наверное потому, что вы тип данных SQL_VARIANT задали
3 май 12, 10:37    [12499298]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31991
GFX
Почему то значение ноды Value1 парсится как 'высшее', но почему там же в конце еще есть пробел, должно быть так же 'высшее '
В чем проблема, как ее можно исправить?
Разве конечные пробелы в XML не игнорируются?
3 май 12, 10:43    [12499352]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
GFX
Member

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

Если сделать так:
DECLARE @xml NVARCHAR(MAX)
SET @xml =
N'<XML>
	<ITEM>		
		<Value1>высшее </Value1>
		<Value2>среднее специальное</Value2>
	</ITEM>
</XML>'
DECLARE @hdoc INT	
EXEC SP_XML_PREPAREDOCUMENT @hdoc OUTPUT, @xml OUTPUT

SELECT * FROM OPENXML(@hdoc, '//XML/ITEM') WITH
(		
	Value1 VARCHAR(2000) 'Value1',
	Value2 VARCHAR(2000) 'Value2'
)
	
EXEC SP_XML_REMOVEDOCUMENT @hdoc 

то все равно получаю значение ноды без пробела :(
3 май 12, 10:49    [12499384]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
alexeyvg
Member

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

Если сделать так:
DECLARE @xml NVARCHAR(MAX)
SET @xml =
N'<XML>
	<ITEM>		
		<Value1>высшее </Value1>
		<Value2>среднее специальное</Value2>
	</ITEM>
</XML>'
DECLARE @hdoc INT	
EXEC SP_XML_PREPAREDOCUMENT @hdoc OUTPUT, @xml OUTPUT

SELECT * FROM OPENXML(@hdoc, '//XML/ITEM') WITH
(		
	Value1 VARCHAR(2000) 'Value1',
	Value2 VARCHAR(2000) 'Value2'
)
	
EXEC SP_XML_REMOVEDOCUMENT @hdoc 


то все равно получаю значение ноды без пробела :(
Пробелы обрезаются ещё до получения Value1 и Value2 и приведения типов, это легко проверитьЮ, выполнив код без WITH
3 май 12, 10:54    [12499419]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
DECLARE @xml NVARCHAR(MAX)
SET @xml =
N'<XML>
	<ITEM>		
		<Value1><![CDATA[высшее ]]></Value1>
		<Value2>среднее специальное</Value2>
	</ITEM>
</XML>'
DECLARE @hdoc INT	
EXEC SP_XML_PREPAREDOCUMENT @hdoc OUTPUT, @xml OUTPUT

SELECT *, datalength(Value1) FROM OPENXML(@hdoc, '//XML/ITEM') WITH
(		
	Value1 VARCHAR(2000) 'Value1',
	Value2 VARCHAR(2000) 'Value2'
)
	
EXEC SP_XML_REMOVEDOCUMENT @hdoc 
3 май 12, 10:58    [12499444]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
GFX
Member

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

не подскажете как проверить?
3 май 12, 11:06    [12499494]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
GFX
Member

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

к сожалению такой синтаксис не подходит, xml генериться на клиенте
3 май 12, 11:07    [12499499]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
GFX,

Что мешает преобразовать ваш xml в нужный вид на сервере?
3 май 12, 11:35    [12499729]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
iljy
Member

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

а вы можете вняино объяснить, зачем вам этот конечный пробел сдался?
3 май 12, 12:02    [12499981]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
alexeyvg
Разве конечные пробелы в XML не игнорируются?
С чего бы это?
DECLARE @xml XML = N'
<XML>
 <ITEM>		
  <Value1>высшее </Value1>
  <Value2>среднее специальное</Value2>
 </ITEM>
</XML>'
SELECT	 Value1 = X.value('Value1[1]','VarChar(2000)')
	,Value2 = X.value('Value2[1]','VarChar(2000)')
FROM	@xml.nodes('//XML/ITEM')N(X)
sp_xml_preparedocument использует старый парсер.
Но в доке ничего не могу найти на счёт этого.
3 май 12, 16:37    [12502729]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Вот вроде как: Новые возможности в SQLXML 4.0 с пакетом обновления 1 (SP1)
BOL
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\Client\SQLXML4\SQL2000CompatMode

По умолчанию, когда средство синтаксического анализа XML загружает данные, пробелы нормализуются в соответствии с правилами XML 1.0. Это приводит к потере некоторых пробельных символов в данных. Таким образом, текстовое представление данных может измениться после синтаксического анализа, хотя семантически данные остаются прежними.

Раздел представлен таким образом, что можно оставить пробельные символы в данных. Если добавить этот раздел реестра и установить его значение равным 0, пробельные символы (возврат каретки, переноса строки и табуляция) в XML-документе возвращаются закодированными для значений атрибутов. Для значений элементов возвращается закодированным только символ возврата каретки.
3 май 12, 16:44    [12502808]     Ответить | Цитировать Сообщить модератору
 Re: OPENXML-парсинг  [new]
GFX
Member

Откуда:
Сообщений: 283
Mnior
Вот вроде как: Новые возможности в SQLXML 4.0 с пакетом обновления 1 (SP1)
BOL
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\Client\SQLXML4\SQL2000CompatMode

По умолчанию, когда средство синтаксического анализа XML загружает данные, пробелы нормализуются в соответствии с правилами XML 1.0. Это приводит к потере некоторых пробельных символов в данных. Таким образом, текстовое представление данных может измениться после синтаксического анализа, хотя семантически данные остаются прежними.

Раздел представлен таким образом, что можно оставить пробельные символы в данных. Если добавить этот раздел реестра и установить его значение равным 0, пробельные символы (возврат каретки, переноса строки и табуляция) в XML-документе возвращаются закодированными для значений атрибутов. Для значений элементов возвращается закодированным только символ возврата каретки.


Понял, спасибо за ссылку. буду ссылаться на нее. что в mssql парсинг в ранних внрсиях косячит
10 май 12, 13:21    [12529622]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить