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

Откуда:
Сообщений: 36
Добрый день!

Есть некая таблица с полем типа XML и некоей структурой данных.

Пусть, для теста, такая:
declare @tempTable table (id int, 
                 data xml)

insert into @tempTable
       select 1,'<Root>
                       <row><id>1</id><name>Иванов</name></row>
                       <row><id>2</id><name>Петров</name></row>
                       <row><id>3</id><name>Кузнецов</name></row>
                    </Root>'  

Можно ли как-то в подобном синтаксисе прицепить к ней условие в предложении where (либо еще где-то?), чтобы можно было получить фамилию по Id, либо наоборот по фамилии.

Т.е. сказать ей:
select data.query('/Root/row/name/text()')
from @tempTable
where  {чего-то такое хитрое, чтобы Root/row/id = 1}
и оно бы мне выдало Иванова.

Причем интересно так, чтоб эта единица могла бы быть полем другой таблицы т.к. использовать это предполагается как-то так:
select st.sometableID,
         (select (select data.query('/Root/row/name/text()')
          from @tempTable
          where  {...} = st.EmployeeID) as EmployeeName
from someTable st
23 окт 09, 18:47    [7831960]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли получить значение из поля XML с наложением условия?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Тут у вас связка, а не условие отбора.
DECLARE	@Table TABLE (
	 ID	Int	IDENTITY PRIMARY KEY
	,Data	XML
)INSERT	@Table
SELECT	 '
<Root>
	<row><id>1</id><name>Иванов</name></row>
	<row><id>2</id><name>Петров</name></row>
	<row><id>3</id><name>Кузнецов</name></row>
</Root>'

;WITH XTable AS (
	SELECT	 T.ID						  AS TID
		,X.value('(id  /text())[1]','Int'		) AS XID
		,X.value('(name/text())[1]','VarChar(256)'	) AS Name
	FROM	@Table T OUTER APPLY T.Data.nodes('/Root/row')X(X)
)	SELECT	*
	FROM	     XTable	T
	--	JOIN someTable	E ON E.EmployeeID = T.XID
А условие и так можно налагать:
T.Data.nodes('/Root/row[id/text()=1]')X(X)
Можно и так:
SELECT Data.value('(/Root/row[id/text()=1]/name/text())[1]','SysName') FROM @Table
И читайте BOL хоть иногда.
26 окт 09, 10:01    [7836893]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли получить значение из поля XML с наложением условия?  [new]
nicht_shiessen
Member

Откуда:
Сообщений: 36
Mnior, спасибо!

BOL безусловно штука полезная, и в конце концов действительно в нём всё (ну или ещё в какой Микрософтовской справке) нашёл (мне, как выяснилось, sql:column нужно было).



Но ведь чтоб что-то конкретное найти - нужно ж знать чего искать. А когда ищешь чёрную кошку в тёмной комнате, да ещё при этом и не знаешь как эта самая кошка должна выглядеть кошка - весьма трудно её там обнаружить. ;-)
27 окт 09, 02:07    [7841669]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить