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

Откуда:
Сообщений: 181
Читаю xml-файл c помощью openxml
при этом
<name></name> читает как null, а как сделать, чтобы прочиталась как пустая строка ''
15 июл 05, 13:31    [1707955]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
a1ex
Member

Откуда: .ua
Сообщений: 369
ange
Читаю xml-файл c помощью openxml
при этом
<name></name> читает как null, а как сделать, чтобы прочиталась как пустая строка ''

так пробовали?
select isnull(name1, 'пустая строка 1'), isnull(name2, 'пустая строка 2')
from openxml (@idoc, '/ROOT/CUST', 1)
with
	(
		name1 varchar(10),
		name2 varchar(20)
	)
15 июл 05, 13:56    [1708138]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
ange
Member

Откуда:
Сообщений: 181
ну это понятно
просто было бы здорово, если бы значение null фигурировало при отсутствии тега, а пустая строка '' при его присутствии с пустым значением
15 июл 05, 14:10    [1708250]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
a1ex
Member

Откуда: .ua
Сообщений: 369
ange
... если бы значение null фигурировало при отсутствии тега ...


где оно должно фигурировать? если тега нет, то нет данных. что в этом случае должен вернуть сервер? это как селект из пустой таблицы. используйте заполняемй шаблон с дефолтными NULL`ами, если вы заранее знаете сколько тегов должно быть.
15 июл 05, 14:46    [1708530]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
ange
Member

Откуда:
Сообщений: 181
Например, у меня xml-файл
<client>
<update>
<row guid=”846804958948568”>
<name>наименование1</name>
<pname>что-то</pname>
<discount>5</discount>
</row>
<row guid=”54668ghjjfgjhjgjh”>
<name> наименование2</name>
<pname></pname>
</row>
<row guid=”jdjsdk8496ghjghj”>
<name> наименование3</name>
<discount></discount>
</row>
</update>
<c/lient>

Открываю
Select * from openxml(@idDoc, ‘/client/update/row’)
With (Guid nvarchar(20) ‘@guid’, Name nvarchar(20) ‘name’,
PName nvarchar(20) ‘pname’, Discount int ‘discount’)

Получаю
Guid Name PName Discount
846804958948568 наименование1 что-то 7
54668ghjjfgjhjgjh наименование2 null null
jdjsdk8496ghjghj наименование3 null 0

Смотрю, как ведет себя Discount
Если в теге <row> указан тег <discount> cо значением – в итоге значение
Если в теге <row> указан тег <discount> без значения – в итоге 0
Если в теге <row> не указан тег <discount> – в итоге null

Теперь pname
Если в теге <row> указан тег <pname> cо значением – в итоге значение
Если в теге <row> указан тег < pname > без значения – в итоге null (а вот здесь хочу пустую строку, а не null)
Если в теге <row> не указан тег < pname > – в итоге null

Как сделать так, чтобы не только численные значения (Discount) вели себя таким образом, но и nvarchar тоже
15 июл 05, 15:53    [1709084]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
ange
Member

Откуда:
Сообщений: 181
так как быть?
как можно это обойти?
15 июл 05, 16:32    [1709364]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
a1ex
Member

Откуда: .ua
Сообщений: 369
вот сделал тестовую проверку с вашими данными
create procedure [dbo].[xml_test]
	@pQUERY ntext
as
	declare @iDOC int
	execute sp_xml_preparedocument @iDOC output, @pQUERY

	select *
	from openxml (@iDOC, '/client/update/row')
	with
	(
		Guid nvarchar(20) '@guid',
		Name nvarchar(20) 'name',
		PName nvarchar(20) 'pname',
		Discount int 'discount'
	)

	execute sp_xml_removedocument @iDOC
GO

получилось именно так, как вы хотите

К сообщению приложен файл. Размер - 0Kb
15 июл 05, 16:45    [1709448]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
ange
Member

Откуда:
Сообщений: 181
а вот у меня во второй и третьей строке pname=null
только что перепроверила
в чем может быть проблема?
15 июл 05, 17:02    [1709586]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
a1ex
Member

Откуда: .ua
Сообщений: 369
покажи
select @@version
15 июл 05, 17:10    [1709657]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
ange
Member

Откуда:
Сообщений: 181
по поводу версии

Microsoft SQL Server 2000 - 8.00.760 (Intel X86)

теперь по поводу продолжения экспериментов
попробовала в схеме With тип данных nvarchar поменять на char - и все получилось как надо

в чем проблема nvarchar?
16 июл 05, 09:12    [1710467]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
ange
Member

Откуда:
Сообщений: 181
И все же никак не получается добиться своего
получить данные типа nvarchar

мне важно именно не char, чтобы пустая часть строки не забивалась пробелами
27 июл 05, 09:29    [1738459]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
ange
И все же никак не получается добиться своего
получить данные типа nvarchar

мне важно именно не char, чтобы пустая часть строки не забивалась пробелами
Вы вот так попробуйте
declare @iDOC int
	execute sp_xml_preparedocument @iDOC output, N'<client>
<update>
<row guid="846804958948568">
<name>наименование1</name>
<pname>что-то</pname>
<discount>5</discount>
</row>
<row guid="54668ghjjfgjhjgjh">
<name> наименование2</name>
<pname></pname>
</row>
<row guid="jdjsdk8496ghjghj">
<name> наименование3</name>
<discount></discount>
</row>
</update>
</client>'

	select * into _____t
	from openxml (@iDOC, '/client/update/row', 1)
	with
	(
		Guid nvarchar(20) '@guid',
		Name nvarchar(20) 'name',
		PName nvarchar(20) 'pname',
		Discount int 'discount'
	)

	execute sp_xml_removedocument @iDOC
и посмотрите структуру таблицы _____t.
27 июл 05, 09:49    [1738514]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
ange
Member

Откуда:
Сообщений: 181
проблема в третьем параметре openxml? нужна единичка?

к сожалению, и это не помогло
27 июл 05, 10:16    [1738614]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
ange
проблема в третьем параметре openxml? нужна единичка?

к сожалению, и это не помогло
Да причем здесь этот флаг (1 равносильна 0, а 0 - по умолчанию) - написал его автоматически, суть запроса не меняется.
Ещё раз и внятно объясните - что у вас не получается? Колонки типа nvarchar не получаются или данные в них дополнены пробелами?
27 июл 05, 10:26    [1738657]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
ange
Member

Откуда:
Сообщений: 181
спасибо
сделал select ... into __t
и увидела что в таблице данные в нужном мне виде

у меня в хранимке работает тоже через
select .... into #tmp_imp from open xml ....

добавляю строку
select coalesce(t.name, 'old'), coalesce(t.pname, 'old'), coalesce(t.discount, -1) from #tmp_imp t

и получаю old если тег не указан вообще, null - если указан но с пыстым значением и значение если тег со значением

отлично - все именно так как мне и нужно
судя по всему квери анализер тип данных nvarchar с пустой строкой отображает как null, хотя все именно так как мне и нужно
27 июл 05, 10:34    [1738696]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
ange
судя по всему квери анализер тип данных nvarchar с пустой строкой отображает как null, хотя все именно так как мне и нужно
Никогда такого не видел. Если в строке стоит NULL, то и QA отображает его как NULL.
27 июл 05, 10:39    [1738724]     Ответить | Цитировать Сообщить модератору
 Re: OpenXML  [new]
ange
Member

Откуда:
Сообщений: 181
тем не менее
на qa и застопорилась
отлаживаю в нем и абсолютно уверена что там null - даже не попыталась обновить таблицу, считая что данные неверные

после вашего предложения попробовать на таблице - увидела что вроде все ок, используя coalesce обновляю(если значение или null) или нет (если тег вообще не указан) свою таблицу и все верно
однако в qa упрямо одни null-ы
27 июл 05, 10:46    [1738765]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить