如何将XQuery表达式标记为确定性? (为了保留来自XML值的计算列)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将XQuery表达式标记为确定性? (为了保留来自XML值的计算列)相关的知识,希望对你有一定的参考价值。

我有一个表,该表的列类型为xml (DOCUMENT <MyDocType>),为此我定义了一个非常小的模式。 XML大致具有以下简单形状:

<root>
    (<a> | <b>)*
</root>

因此具有0个或多个ab类型的子元素的根。就这样。

我想从该数据中获取一个持久化的计算列,该数据来自root每个子级的串联字符串值;因此,我创建了一个UDF以对每个文档的内容进行字符串化:

create function stringify (@doc xml (document MyDocType))
returns varchar(256)
as begin
    return convert(varchar(256), @doc.query('
        for $val in /root/*
            return string($val)'))
end

但是当使用此函数作为持久化列的源时,数据库会抱怨该函数不确定。

根据我的直觉,我认为这个功能是确定性的。但是数据库似乎与我不同意。我了解XQuery可能可以执行某些不确定性的事情,但这是否会使所有XQuery查询具有不确定性呢?

是否有一种方法可以告诉数据库“嘿,这个采用XML并返回字符串的函数是确定性的-让我用它派生一个持久化的计算列”]]

我有一个表,该表的列类型为xml(DOCUMENT ),为此我定义了一个非常小的模式。 XML大致具有以下简单形状:([ | )* &...

答案
create function dbo.xmldata(@thexml xml)
returns nvarchar(max)
with schemabinding
as
begin
    return (@thexml.value('data(.)', 'nvarchar(max)'))
end
go

create table dbo.testabc
(
    thexml xml,
    thestring as dbo.xmldata(thexml) persisted
)
go

insert into dbo.testabc(thexml)
values('<root><a>aaaaa</a><b>bbbbb</b></root>')
go

select * 
from dbo.testabc
go

drop table dbo.testabc
go
drop function dbo.xmldata;
go

以上是关于如何将XQuery表达式标记为确定性? (为了保留来自XML值的计算列)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XQuery 检索父节点?

Fulltext Xquery (Lucene/KWIC) 不适用于“标记”结果。 eXist-db 错误?

XQuery 和空 HTML 标记

正则表达式 - 将 HTML 转换为有效的 XML 标记 [重复]

XQuery FLWOR 表达式

对具有不确定数据的数组进行排序