我在表中有一个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,Level 16,State 1,Line 2表'CustomMetadataTable'中的计算列'StartDate'无法保留,因为该列是非确定性的.
它适用于我:
使用varchar,int,double(即datetime除外)值
删除PERSISTED关键字(但我不能在列上创建索引)
我还应该提到日期时间值是XSD日期时间格式.有任何想法吗?谢谢.
关于什么:
CREATE FUNCTION [dbo].[fComputeValue] (@data XML) RETURNS varchar(50) WITH SCHEMABINDING AS BEGIN RETURN @data.value('(/Metadata/Value[@Key="StartDate"])[1]', 'varchar(50)') END
和:
ALTER TABLE dbo.CustomMetadataTable ADD [StartDate] AS (convert(datetime,([dbo].[fComputeValue]([CustomMetadataColumn]), 127)) PERSISTED
要么:
return convert(datetime, @data.value('(/Metadata/Value[@Key="StartDate"])[1]', 'varchar(50)'), 127)
从在线书籍:
CONVERT
除非存在以下条件之一,否则是确定性的:源类型是sql_variant.
目标类型是sql_variant,其源类型是不确定的.
源或目标类型是datetime或smalldatetime,其他源或目标类型是字符串,并指定了不确定的样式.要确定性,样式参数必须是常量.此外,小于或等于100的样式是不确定的,但样式20和21除外.大于100的样式是确定性的,样式106,107,109和113除外.
如果你使用CONVERT
风格可能会有所帮助127