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

Откуда:
Сообщений: 27
есть таблица, в которой один столбец имеет тип XML формата
<Root>
<Phone>
<Тип>домашний телефон</Тип>
<Значение>12345</Значение>
</Phone>
</Root>

как посредством TSQL осуществить поиск значения в элементе "Значение"?
12 сен 11, 03:40    [11261875]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
aleks2
Guest
1. И я, и я хачу спросить!
Как мне сделать поиск по шифрованному NVARCHAR, ключ к которому неизвестен?

2. Ну... Full Text Seach должон справиться.
12 сен 11, 05:59    [11261903]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
Toetomi
Member

Откуда:
Сообщений: 27
aleks2,
не понял ответ...
мне нужны механизмы поиска значений в строке типа XML. Именно функционал поиска в XML строке. Предварительные конвертации в строковую переменную не подходят.
12 сен 11, 06:45    [11261924]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
aleks2
Guest
Ты, наверное, удивишься, но "строка типа XML" одновременно и "просто строка". Но если тебе надо что-то возвышенное - мечтай и жди. MS активно разрабатывает кнопку "Сделать как я хачу!". К 3000г обещали бету.

ЗЫ. Ну можна попробовать OPENXML вкупе с CROSS APPLY. Тормоз - тоже механизм.
12 сен 11, 07:15    [11261937]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
Toetomi
Member

Откуда:
Сообщений: 27
aleks2,
:)
Чтобы работать с XML как со строкой, нужно преобразовать ее сначала в строку...меня это не устраивает...OPENXML тоже.
Думаю, хотя уверен, есть механизмы работы с XML строкой, раз уж есть такая переменная, было бы здорово, чтобы кто-то знающий их описал или дал ссылку именно для того стиля XML, что я привел.
По всей видимости, ты знаешь не больше моего...но я подожду того, кто сталкивался с необходимостью поиска значений в XML.
12 сен 11, 07:23    [11261941]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Toetomi, посмотрите на XQuery и XML индексы
12 сен 11, 08:50    [11262042]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
Select 
	* 
from
	MyTable t
Where
	t.x.exist('/Root/Phone/Значение[(text()[1]) = ("12345")]') = 1

?
12 сен 11, 09:00    [11262052]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
Toetomi
Member

Откуда:
Сообщений: 27
HandKot,
О, спасибо...
Теперь я могу искать по значению, а не подскажите, как вывести значение узла <тип>?
12 сен 11, 09:13    [11262071]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
Toetomi
Member

Откуда:
Сообщений: 27
И потом как искать по переменной?
т.е. "12345" - присваивать переменной и потом уже использовать в поиске?
12 сен 11, 09:17    [11262082]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
x.value('(/Root/Phone/Тип)[1]', 'varchar(100)') 

и почитайте БОЛ
12 сен 11, 09:21    [11262089]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Toetomi
И потом как искать по переменной?
т.е. "12345" - присваивать переменной и потом уже использовать в поиске?
См. Привязка реляционных данных внутри XML-данных
Например, sql:variable("@phone")
12 сен 11, 09:24    [11262109]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
DECLARE @tbl TABLE (id INT IDENTITY, f XML)

INSERT INTO @tbl(f)
SELECT '<Root>
<Phone>
<Тип>домашний телефон</Тип>
<Значение>12345</Значение>
</Phone>
</Root>' UNION ALL SELECT
'<Root>
<Phone>
<Тип>рабочий телефон</Тип>
<Значение>54321</Значение>
</Phone>
</Root>'

SELECT  *
      , f.query('/Root/Phone/Значение').value('.', 'varchar(10)')
      , f.value('(/Root/Phone/Значение)[1]', 'varchar(10)')
FROM    @tbl t
WHERE   f.query('/Root/Phone/Значение').value('.', 'varchar(10)') = '12345'
Уже ответили, но хоть сам поигрался слегка ;), а то все никак руки не доходят с XQuery разобраться.
12 сен 11, 09:31    [11262128]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
Toetomi
Member

Откуда:
Сообщений: 27
Большое спасибо!
12 сен 11, 09:40    [11262157]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значений в столбце типа XML  [new]
mike909
Member

Откуда:
Сообщений: 662
kDnZP
Уже ответили, но хоть сам поигрался слегка ;), а то все никак руки не доходят с XQuery разобраться.

+1 Уже ответили,
но судя по структуре Вашего XML_я есть подозрение, что узлов <Phone> может быть несколько, а это не учтено ...
+ Чтоб учесть
DECLARE @tbl TABLE (id INT IDENTITY, f XML)
DECLARE @Phone NVARCHAR(20)
SET @Phone = '54321'

INSERT INTO @tbl(f)
SELECT '
<Root>
  <Phone>
    <Тип>домашний телефон</Тип>
    <Значение>12345</Значение>
  </Phone>
  <Phone>
    <Тип>Ну очень рабочий телефон</Тип>
    <Значение>54321</Значение>
  </Phone>
  <Phone>
    <Тип>Ну совсем рабочий телефон</Тип>
    <Значение>54321</Значение>
  </Phone>
</Root>' 
UNION ALL SELECT
'<Root>
  <Phone>
    <Тип>рабочий телефон</Тип>
    <Значение>54321</Значение>
  </Phone>
</Root>'

SELECT t.*, p.pType
FROM @tbl AS t
CROSS APPLY (
	SELECT n.v.value('../Тип[1]','sysname') AS [pType]
	FROM t.f.nodes( 'Root/Phone/Значение[text()=sql:variable("@Phone")]' ) AS n(v)
) AS p
12 сен 11, 10:58    [11262584]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить