如何将XQuery表达式标记为确定性? (为了保留来自XML值的计算列)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将XQuery表达式标记为确定性? (为了保留来自XML值的计算列)相关的知识,希望对你有一定的参考价值。
我有一个表,该表的列类型为xml (DOCUMENT <MyDocType>)
,为此我定义了一个非常小的模式。 XML大致具有以下简单形状:
<root>
(<a> | <b>)*
</root>
因此具有0个或多个a
或b
类型的子元素的根。就这样。
我想从该数据中获取一个持久化的计算列,该数据来自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
答案
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值的计算列)的主要内容,如果未能解决你的问题,请参考以下文章
Fulltext Xquery (Lucene/KWIC) 不适用于“标记”结果。 eXist-db 错误?