を:は計算列存続することはできません - 私は計算列のため、この機能を持って決定論的ではない
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
を追加しました。 2つの入力として[Week]
と[Year]
は常に同じ結果が得られるはずです。
正確なエラーである:カラムは非決定的であるため、テーブル内の
計算カラム 'AllocatedTimeStart「Tmp_Bookings」が持続することはできません。
私は列にこの数式を使用しています:
([dbo].[GetAllocatedStartTime]([Year],[Week]))
と列DEFS:
[Week] [int] NOT NULL,
[Year] [int] NOT NULL,
[AllocatedTimeStart] AS ([dbo].[GetAllocatedStartTime]([Year],[Week])),
任意のアイデア?
EDIT:
変更行に:
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))
しかし、今、私は列の式は無効であるというエラーを取得します。この関数はうまく節約されます。
EDIT 2:
私は私がやっているかを正確に示してきた(または少なくとも私が試してみました)。本当に特別なことは何もありません。以前の関数(元の関数)は、式のref [dbo].AllocatedStartDate(...)
と結び付けられているが、その列では機能していたが、永続していなかったという。だから、提案によると、私は新しいコードに変換部を交換し、機能を変更し、その機能は今のようになります。
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
それを使用しないでください。しかし、実際には私が今言ったこと以外は何もありません。
問題は関数ではなく、テーブル上の計算列にあります。その定義をあなたの質問に投稿してください。 – Lamak
これはどのバージョンのSQL-Serverですか? –
@ypercube 2008 R2 – sprocket12