Сохранение вычисляемого столбца даты и времени в SQL Server 2005 - PullRequest
5 голосов
/ 29 октября 2008

У меня есть столбец 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 (т. Е. Кроме datetime)
  • удалить ключевое слово PERSISTED (но тогда я не могу создать индекс для столбца)

Следует также отметить, что значения даты и времени представлены в формате XSD datetime. Есть идеи? Спасибо.

1 Ответ

7 голосов
/ 29 октября 2008

А как же:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...