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

时间:2008-10-29 12:50:21

标签: sql sql-server sql-server-2005

我在表格中有一个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'表中不能   因为列是持久的   非确定性。

如果我:

  • 使用varchar,int,double(即不是datetime)值
  • 删除PERSISTED关键字(但我无法在列上创建索引)

我还应该提到日期时间值是XSD日期时间格式。 有任何想法吗?感谢。

1 个答案:

答案 0 :(得分:7)

怎么样:

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,另一个来源或   target type是一个字符串,和   指定了一个非确定性样式。   要确定性,风格   参数必须是常量。   另外,样式小于或   等于100是不确定的,   样式20和21除外。样式   超过100是确定性的,   样式106,107,109和   113。

如果您使用CONVERT样式127

,这可能会有所帮助