如何在 XML 中转换聚合函数

发布于 2024-10-09 03:13:07 字数 704 浏览 0 评论 0原文

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

: 使用 Nodes 函数 MAX 来自 T-SQL,没有 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 可以临时计算字符串表达式。但第一个查询不起作用。 如何强制字符串参数为 fn:max?

In SQL Server 2008.

I need execute a query like that:

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

But return nothing (apparently because convert xdt:untypedAtomic to numeric)

How to "cast" r/c to varchar?

Something like

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

Edit:
Using Nodes the function MAX is from T-SQL no fn:max function
In this code:

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

both query return expected: 2 and "Other Text"
fn:max can evaluate string expression ad hoc. But the first query dont work.
How to force string arguments to fn:max?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北城挽邺 2024-10-16 03:13:07
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))')
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))')
故事未完 2024-10-16 03:13:07

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

This will perform the aggregate max function in 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])

Returns

Other Text

After your update, I think I better understand your question. Unfortunately It looks like this may not be doable in 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))') 

Yields the error:

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

According to Microsoft the type cast is valid, but I haven't been able to find a syntax that will work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文