我在一张表中有一个XML列,我想将该XML中的某个值“提升”为计算列,并对其进行索引以实现更快的搜索。我有一个函数,可以接收XML信息并输出感兴趣的元素,就像这样:
CREATE FUNCTION [dbo].[fComputeValue] (@data XML)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
RETURN @data.value('(/Metadata/Value[@Key="StartDate"])[1]', 'datetime')
END
然而,当我尝试创建计算列时:
ALTER TABLE dbo.CustomMetadataTable ADD [StartDate] AS ([dbo].[fComputeValue]([CustomMetadataColumn])) PERSISTED
我遇到了以下错误:
Msg 4936,级别 16,状态 1,第 2 行 在表“CustomMetadataTable”中的计算列“StartDate”无法持久化,因为该列是非确定性的。
如果我:
- 使用 varchar、int、double 值(即除 datetime 之外的其他值)
- 移除 PERSISTED 关键字(但是这样就无法在该列上创建索引)