如何在XML中转换聚合函数

时间:2010-12-23 17:11:32

标签: sql-server xml tsql xquery-sql

在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转换为数字)

如何将r / c“转换”为varchar?

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

编辑: 使用节点,函数MAX来自T-SQL no fn:max函数 在这段代码中:

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 个答案:

答案 0 :(得分:3)

这将在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,类型转换是有效的,但我找不到可行的语法。

答案 1 :(得分:3)

来自我的SLoW大脑...这应该有用......

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))')