Невозможно сохранить вычисляемый столбец - недетерминированный
У меня есть эта функция для вычисляемого столбца:
CREATE FUNCTION [dbo].[GetAllocatedStartTime](@Year INT, @Week INT)
RETURNS DATETIME
WITH schemabinding
AS BEGIN
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT([varchar](4),@Year,(0))+'-01-01'),(1))))
END
GO
Я добавилWITH schemabinding
в надежде, что это сделает его детерминированным, и я смогу его сохранить. Должно быть как два входа[Week]
а также[Year]
всегда будет давать одинаковые результаты.
Точная ошибка:
Вычисляемый столбец «AllocatedTimeStart» в таблице «Tmp_Bookings» не может быть сохранен, поскольку столбец недетерминирован.
Я использую эту формулу в столбце:
([dbo].[GetAllocatedStartTime]([Year],[Week]))
И столбец defs:
[Week] [int] NOT NULL,
[Year] [int] NOT NULL,
[AllocatedTimeStart] AS ([dbo].[GetAllocatedStartTime]([Year],[Week])),
Есть идеи?
РЕДАКТИРОВАТЬ:
Изменена строка на:
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))
Но теперь я получаю сообщение о том, что формула для столбца неверна. Хотя функция сохраняет нормально.
РЕДАКТИРОВАТЬ 2:
Я показал именно то, что я делаю (или, по крайней мере, я пытался). Там нет ничего лишнего на самом деле. Как говорится, предыдущая функция (оригинальная) в сочетании с формулой ref[dbo].AllocatedStartDate(...)
чтобы оно в колонке работало, но не настаивало, в нем говорилось, что оно не детерминировано. Таким образом, согласно предложению, я изменил FUNCTION, заменив часть преобразования новым кодом, поэтому теперь функция выглядит так:
FUNCTION [dbo].[GetSTime](@Year INT, @Week INT)
RETURNS DATETIME
WITH schemabinding
AS BEGIN
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))
END
Затем я попробовал ту же формулу, что и раньше, в вычисляемом поле(([dbo].[GetAllocatedStartTime]([Year],[Week])))
... и он отклоняет формулу, говорит, что она недействительна ... что странно, поскольку формула одинакова, поэтому он должен выполнить какую-то проверку измененной функции и найти ее недействительной, что также странно потому что я сделал простуюSELECT dbo.GetAllocatedStartTime(2012,13)
и это сработало ...
Так что да, я в замешательстве, и я никогда не виделSqlFiddle
не берите в голову использовать это. Но на самом деле нет ничего больше, чем то, что я только что сказал.