Não é possível persistir a coluna computada - não é determinista
Eu tenho essa função para uma coluna computada:
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
Eu adicionei oWITH schemabinding
na esperança, seria determinista, para que eu possa persistir. Deve ser como as duas entradas[Week]
e[Year]
sempre produzirá os mesmos resultados.
O erro exato é:
A coluna computada 'AllocatedTimeStart' na tabela 'Tmp_Bookings' não pode ser mantida porque a coluna é não-determinística.
Eu estou usando essa fórmula na coluna:
([dbo].[GetAllocatedStartTime]([Year],[Week]))
E a coluna defs:
[Week] [int] NOT NULL,
[Year] [int] NOT NULL,
[AllocatedTimeStart] AS ([dbo].[GetAllocatedStartTime]([Year],[Week])),
Alguma ideia?
EDITAR:
Linha alterada para:
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))
Mas agora recebo um erro dizendo que a fórmula da coluna é inválida. Mesmo que a função seja bem salva.
EDIT 2:
Eu mostrei exatamente o que estou fazendo (ou pelo menos eu tentei). Não há nada extra realmente. Como diz a função anterior (original) acoplada com a fórmula ref[dbo].AllocatedStartDate(...)
para ele na coluna trabalhada, mas não estava persistindo, dizia que era não determinista. Então, de acordo com a sugestão, eu mudei a FUNCTION, substituindo a parte de conversão pelo novo código, então a função agora se parece com:
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
Então eu tentei a mesma fórmula que antes no campo computado(([dbo].[GetAllocatedStartTime]([Year],[Week])))
... e rejeita a fórmula, diz que ela não é válida ... o que é estranho, já que a fórmula é a mesma, então ela deve estar fazendo algum tipo de verificação da função alterada e achando que ela é inválida, o que também é estranho porque eu fiz uma planícieSELECT dbo.GetAllocatedStartTime(2012,13)
e funcionou ...
Então sim eu estou confuso, e eu nunca viSqlFiddle
não importa usar. Mas realmente não há nada mais do que acabei de dizer.