У меня есть таблица, которая бессмысленно имеет значения DateTime, хранящиеся в столбцах Год (INT
), Месяц (INT
), День (INT
) и Время (FLOAT
);к сожалению, мне не разрешено это менять, но есть требование разбить таблицу по годам и месяцам.Поэтому я пытаюсь создать постоянный вычисляемый столбец для хранения DateTime в формате DATETIME2
.Однако моя CreateDateTime
скалярная функция считается "недетерминированной", когда я пытаюсь добавить вычисляемый столбец на ее основе.
Это моя CreateDateTime
функция.
CREATE FUNCTION dbo.CreateDateTime
(
@year SMALLINT,
@month TINYINT,
@day TINYINT,
@time FLOAT
)
RETURNS DATETIME2
WITH SCHEMABINDING
AS
BEGIN
DECLARE @paddedYear VARCHAR(4) = FORMAT(@year, '0000')
DECLARE @paddedMonth VARCHAR(2) = FORMAT(@month, '00')
DECLARE @paddedDay VARCHAR(2) = FORMAT(@day, '00')
DECLARE @formattedTime VARCHAR(8) = FORMAT(@time, '00:00:00')
RETURN IIF
(
@year IS NULL
OR @month IS NULL
OR @day IS NULL,
NULL,
CAST
(
IIF
(
@time IS NULL OR TRY_CONVERT(TIME, @formattedTime) IS NULL,
@paddedYear
+ @paddedMonth
+ @paddedDay,
@paddedYear
+ @paddedMonth
+ @paddedDay
+ ' '
+ @formattedTime
)
AS DATETIME2
)
)
END
Но при использовании для попытки добавить вычисляемый столбец для DateTime (со следующим сценарием) это приводит к следующему сообщению об ошибке.
ALTER TABLE dbo.Logs
ADD [DateTime] AS (dbo.CreateDateTime(RY, RM, RD, RT)) PERSISTED
Вычисляемый столбец «DateTime»в таблице «Журналы» не могут быть сохранены, потому что столбец недетерминирован.
Я пытался изменить CreateDateTime
до очень простой функции, которая возвращает фиксированный DateTime, используя следующее: CAST('20000101' AS DATETIME2)
, CONVERT(DATETIME2, '20000101')
и '20000101'
, но все они выдают ту же ошибку, что и выше.Мне удалось добавить столбец, хотя, если я заставил функцию CreateDateTime
возвращать VARCHAR(8)
, вместо этого, похоже, проблема с DATETIME2
.
Как я могу создать эту функцию CreateDateTime
, чтобы онасчитается детерминированным и все еще возвращает DATETIME2
?