Похоже, вы хорошо понимаете, что это не обычная проблема убеждения синтаксического анализатора в том, что в value()
передается только одна вещь. Эта проблема характерна для типизированного XML , как вы заметили.
С помощью Google я нашел этот древний пост с многообещающим текстом
rt является частью модели данных XQuery 1.0 / XPath 2.0.
Большинству людей это удается. Настоящее веселье начинается, когда вы создаете примеры, используя нетипизированные выражения XML и XPath с тестом узла text (). text () прекрасно работает при использовании нетипизированного XML, но не удается набрать типизированный XML с простым содержимым
В нем говорится о SQL Books Online и документе о наилучшей практике XML для SQL Server 2005, который, как мне кажется, является этой книгой . Я не искал более актуальную ссылку. Но используя то, что я нашел там, я смог решить вашу проблему: Простая замена
SELECT r.o.value('(../@a)[1]','varchar(20)') FROM @x2.nodes('/r//o') r(o);
с
SELECT r.o.value('fn:string(../@a)[1]','varchar(20)') FROM @x2.nodes('/r//o') r(o);
По сути, value()
не нравится, когда ему присваиваются значения typeed-xml-type, но нужны строки. Итак, мы даем ему строку.