当前位置:  开发笔记 > 数据库 > 正文

在SQL Server 2005中保留计算的datetime列

如何解决《在SQLServer2005中保留计算的datetime列》经验,为你挑选了1个好方法。

我在表中有一个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日期时间格式.有任何想法吗?谢谢.



1> Bogdan Maxim..:

关于什么:

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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有