2012-04-09 4 views
3

Я новичок в xquery в SQL Server.Каково значение [1] в Xquery

Я часто встречаю выражения xquery, используя [1] с атрибутами.

Может кто-нибудь объяснить, что это значит?

Вот пример

declare @aa xml 
set @aa='<data> 
    <row> 
    <Value>1</Value> 
    <Text>Masters</Text> 
    </row> 
    <row> 
    <Value>2</Value> 
    <Text>Transactions</Text> 
    </row> 
    <row> 
    <Value>3</Value> 
    <Text>Misch. Reports</Text> 
    </row> 
</data>' 


select a.f.value('Value[1]','varchar(50)'), -- why [1] here ? 
    a.f.value('Text[1]','varchar(50)')   -- and here too.. 
from @aa.nodes('/data/row') as a(f) 

Благодаря п Regards

+0

Хороший Q - Я всегда считал, что это был индекс (первое вхождение 'value' узла), но я не уверен, что – JNK

+0

конечно это не показатель в противном случае это обыкновение возвращать несколько строк – Deb

+0

Ну ответ, кажется, указать иначе :) Имейте в виду, что это иерархия, поэтому я думаю, что это первый узел значений на этом уровне дерева. Вы несколько строк, чтобы получить несколько значений. – JNK

ответ

3

В этом случае вы говорите, вы хотите первый Value элемент для текущего /data/row и первый Text элемент для того же. Если вы поместите [2], это будет означать второй. Помещая [1], даже если вы знаете, что будет только одна строка, вы убедитесь, что только один элемент войдет в функцию value.

+0

Это все? нет другой причины? – Deb

+0

Что это значит? Да, это все. Это происходит потому, что вы могли бы иметь '' и хотите, чтобы получить третий 'Data' элемент в запросе. Таким образом, синтаксис '[#]' позволяет это. –

+0

Я почти уверен, но все еще жду, если у кого-то больше информации. – Deb

8

В XPath синтаксис [expression] обозначает predicate по пути местоположения. [1] - abbreviated syntax для [position()=1], что означает «первый элемент». В SQL Server использование XPath требует [1] (или любого другого предиката, который детерминистически фильтрует не более одного элемента), потому что он преобразует выражение XPath из того, которое возвращает любое количество элементов в число, которое детерминистически возвращает 0 или 1 элемент, таким образом преобразуя в скалярное выражение, которое требуется .value():

XQuery должен возвращать не более одного значения.

+0

Очень хорошо проделанный ответ. Спасибо за ссылки. –

+0

Я был действительно информативным. Спасибо Ремусу .. – Deb