【问题标题】:Persisting a computed datetime column in SQL Server 2005在 SQL Server 2005 中保留计算的日期时间列
【发布时间】:2008-10-29 12:50:20
【问题描述】:

我在表中有一个 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

我收到以下错误:

消息 4936,第 16 级,状态 1,第 2 行 计算列 '开始日期' 在表 'CustomMetadataTable' 中不能 持续存在,因为该列是 非确定性的。

如果我可以:

  • 使用 varchar、int、double(即日期时间除外)值
  • 删除 PERSISTED 关键字(但我无法在列上创建索引)

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

【问题讨论】:

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


    【解决方案1】:

    怎么样:

    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 及其 源类型是不确定的。

    源或目标类型是日期时间或 smalldatetime,其他来源或 目标类型是字符串,并且 指定了不确定的样式。 为了确定性,风格 参数必须是常数。 此外,款式小于或 等于 100 是不确定的, 样式 20 和 21 除外。样式 大于 100 是确定性的, 除了样式 106、107、109 和 113.

    如果您将CONVERT127 样式一起使用可能会有所帮助

    【讨论】:

    • 谢谢!我有同样的问题。我想知道为什么 127 有效而其他人不有效?
    • 这是原因:“大于 100 的样式是确定性的,但样式 106、107、109 和 113 除外。”
    • 除了更改 ALTER TABLE 语句之外,您还可以更改 fComputeValue FUNCTION 定义:如果您在主体/实现中使用样式 127 调用 CONVERT,该函数可以返回 OP 想要的日期时间函数。
    • 您可以在the CONVERT page上找到有关哪些转换样式是确定性的信息。
    猜你喜欢
    • 2015-04-22
    • 2012-07-22
    • 1970-01-01
    • 2011-11-17
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多