Nie można utrwalić kolumny obliczeniowej - nie deterministycznej

Mam tę funkcję dla kolumny obliczeniowej:

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

DodałemWITH schemabinding w nadziei, że uczyni to to deterministycznym, abym mógł to utrzymać. Powinien być jako dwa wejścia[Week] i[Year] zawsze przyniesie takie same wyniki.

Dokładny błąd to:

Obliczona kolumna „AllocatedTimeStart” w tabeli „Tmp_Bookings” nie może zostać utrwalona, ​​ponieważ kolumna jest niedeterministyczna.

Używam tej formuły w kolumnie:

([dbo].[GetAllocatedStartTime]([Year],[Week]))

A defekty kolumn:

[Week] [int] NOT NULL,
[Year] [int] NOT NULL,
[AllocatedTimeStart]  AS ([dbo].[GetAllocatedStartTime]([Year],[Week])),

Jakieś pomysły?

EDYTOWAĆ:

Zmieniono linię na:

RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))

Ale teraz pojawia się błąd mówiący, że formuła kolumny jest nieprawidłowa. Nawet jeśli funkcja oszczędza dobrze.

EDYCJA 2:

Pokazałem dokładnie, co robię (lub przynajmniej spróbowałem). Naprawdę nie ma nic nadzwyczajnego. Jak mówi poprzednia funkcja (oryginalna) w połączeniu z formułą ref[dbo].AllocatedStartDate(...) do tego w kolumnie zadziałało, ale nie trwało, mówiło, że nie jest deterministyczne. Zgodnie z sugestią zmieniłem FUNKCJĘ, zastępując część konwersji nowym kodem, więc funkcja wygląda teraz tak:

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

Następnie wypróbowałem tę samą formułę, co wcześniej w polu obliczeniowym(([dbo].[GetAllocatedStartTime]([Year],[Week]))) ... i odrzuca formułę, mówi, że jest nieważna ... co jest dziwne, ponieważ formuła jest taka sama, więc musi to być pewnego rodzaju sprawdzenie zmienionej funkcji i stwierdzenie, że jest ona nieważna, co również jest dziwne ponieważ zrobiłem prostąSELECT dbo.GetAllocatedStartTime(2012,13) i działało ...

Więc tak, jestem zdezorientowany i nigdy nie widziałemSqlFiddle nieważne, używaj go. Ale tak naprawdę nie ma nic więcej niż to, co właśnie powiedziałem.

questionAnswers(1)

yourAnswerToTheQuestion