Как привести в XML для агрегатных функций - PullRequest
3 голосов
/ 23 декабря 2010

В SQL Server 2008.

Мне нужно выполнить такой запрос:

DECLARE @x AS xml
SET @x=N'<r><c>First Text</c></r><r><c>Other Text</c></r>'
SELECT @x.query('fn:max(r/c)')

Но ничего не вернуть (очевидно, потому что преобразовать xdt: untypedAtomic в число)

Как «навести» р / с на варчар?

Что-то вроде

SELECT @x.query('fn:max(«CAST(r/c «AS varchar(20))»)')

Редактировать: Используя узлы, функция MAX из T-SQL no fn: max function В этом коде:

DECLARE @x xml;
SET @x = '';
SELECT @x.query('fn:max((1, 2))');
SELECT @x.query('fn:max(("First Text", "Other Text"))');

оба запроса возвращаютожидается: 2 и «Другой текст» fn: max может оценить строковое выражение ad hoc.Но первый запрос не работает.Как заставить строковые аргументы в fn: max?

Ответы [ 2 ]

3 голосов
/ 25 февраля 2012

из моего МЕДЛЕННОГО мозга ... это должно работать ...

DECLARE @x AS xml
    , @val nvarchar(100) = 'Other Text'
SET @x=N'<r><c>First Text</c></r><r><c>Other Text</c></r>'
SELECT @x.query('fn:max(for $r in //r return xs:string ($r))')
3 голосов
/ 23 декабря 2010

Это будет выполнять функцию агрегирования max в T-SQL:

DECLARE @x AS xml
 SET @x=N'<r><c>First Text</c></r><r><c>Other Text</c></r>'

  SELECT 
  MAX(r.value('.','varchar(25)'))
  FROM @x.nodes('/r/c') r([r])

Возвращает

Other Text

После вашего обновления, думаю, я лучше понимаю ваш вопрос. К сожалению, похоже, что это невозможно в MS SQL Server 2008 R2.

DECLARE @x AS xml
SET @x=N'<r><c>First Text</c></r><r><c>Other Text</c></r>'
SELECT @x.query('fn:max(xs:string(r/c))') 

выдает ошибку:

Msg 2365, Level 16, State 1, Line 3
XQuery [query()]: Cannot explicitly convert from 'xdt:untypedAtomic *' to 'xs:string'

Согласно Microsoft приведение типа допустимо, но я не смог найти синтаксис, который будет работать.

...