-1

2つの計算列が[StartTime]あり、[EndTime]

およびは、および列を使用した式[StartTime][EndTime]計算されます。[Week][Year]

[Status]ここで、最初の2つを使用して計算された別の計算列が必要です。しかし、数式内でそれらの1つを使用しようとすると、数式にエラーが発生します。[Status]

代替手段がないので、これが機能するために本当に必要です。しかし、これも可能ですか?

ここにあなたはMr-1に行きます:

(case when [IsVOR]=(1) then 'VOR' 
      when [MarkedAsCompleteOn] IS NULL AND [Year]<datepart(year,getdate()) then 'Overdue' 
      when [MarkedAsCompleteOn] IS NULL AND [Year]>datepart(year,getdate()) then 'Not Due' 
      when [MarkedAsCompleteOn] IS NULL AND [Year]=datepart(year,getdate()) AND [Week]<datepart(iso_week,getdate()) then 'Overdue' 
      when [MarkedAsCompleteOn] IS NULL AND [Year]=datepart(year,getdate()) AND [Week]=datepart(iso_week,getdate()) then 'Due' 
      when [MarkedAsCompleteOn] IS NULL AND [Year]=datepart(year,getdate()) AND [Week]>datepart(iso_week,getdate()) then 'Not Due' 
      when [MarkedAsCompleteOn] IS NOT NULL AND [Year]<datepart(year,[MarkedAsCompleteOn]) then 'Late' 
      when [MarkedAsCompleteOn] IS NOT NULL AND [Year]>datepart(year,[MarkedAsCompleteOn]) then 'Early' 
      when [MarkedAsCompleteOn] IS NOT NULL AND [Year]=datepart(year,[MarkedAsCompleteOn]) AND [Week]<datepart(iso_week,[MarkedAsCompleteOn]) then 'Late' 
      when [MarkedAsCompleteOn] IS NOT NULL AND [Year]=datepart(year,[MarkedAsCompleteOn]) AND [Week]=datepart(iso_week,[MarkedAsCompleteOn]) then 'On Time' 
      when [MarkedAsCompleteOn] IS NOT NULL AND [MarkedAsCompleteOn]<[AllocatedTimeStart] then 'Early'  end)

その最後の部分はエラーを引き起こします:

[MarkedAsCompleteOn]<[AllocatedTimeStart] then 'Early'

そして、エラーは一般的です:

- Error validating the formula for column 'Status'.
4

2 に答える 2

0

いいえ。1つの計算列を別の計算列に基づくことはできません。これには特定のエラーがあります(1759):

テーブル'%s'の計算列'%s'は、別の計算列定義で使用できません。

テーブルに基づいてビューを作成し、ビュー定義内で2回目の計算を実行できます。次に、ビューに対してすべてのアクティビティを実行するか(必要に応じてトリガーを追加する)、それをルックアップにのみ使用するかは、設計上の決定を行う必要があります。

もちろん、ビューを使用するというアイデアを追加すると、共通テーブル式を使用して、複数の(2つだけではない)計算レイヤーを構築できます。

ビューがインデックス付きビューになる資格がない限り、計算列を永続化する機能は失われます。この場合、日付計算に基づいているように見えるため、これは重要ではなく、とにかく永続化できない可能性があります。

于 2013-01-02T10:57:23.183 に答える
0

最終的には、を使用して独自のソリューションを見つけましたfunction。これにより、本番アプリは変更なしで動作し続けました。

USE [DBNAME]
GO
/****** Object:  UserDefinedFunction [dbo].[GetStatus]    Script Date: 01/02/2013 11:08:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[GetStatus](@CompletedOn DATETIME, @Year INT, @Week INT)
RETURNS NVARCHAR(MAX)
AS BEGIN
    DECLARE @CurrentDate DATETIME
    DECLARE @StartTime DATETIME
    DECLARE @EndTime DATETIME
    DECLARE @Status NVARCHAR(MAX)

    SET @CurrentDate = GETDATE()
    SET @StartTime = (dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT([varchar](4),@Year,(0))+'-01-01'),(1)))))
    SET @EndTime = (dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT([varchar](4),@Year,(0))+'-01-01'),(8)))))

    SET @Status = '-'
    IF(@CompletedOn IS NULL)
        BEGIN
            IF(@CurrentDate < @StartTime)
                SET @Status = 'Not Due'
            IF(@CurrentDate > @StartTime AND @CurrentDate < @EndTime)
                SET @Status = 'Due'
            IF(@CurrentDate > @EndTime)
                SET @Status = 'Overdue'
        END
    ELSE
        BEGIN
            IF(@CompletedOn < @StartTime)
                SET @Status = 'Early'
            IF(@CompletedOn > @EndTime)
                SET @Status = 'Late'
            ELSE
                SET @Status = 'On Time'
        END

    RETURN @Status
END

そして、statusフィールドに私は式を入れました:

([dbo].[GetStatus]([MarkedAsCompleteOn],[Year],[Week]))

これは私の初めてfunctionsql serverので、最適ではないかもしれません。

于 2013-01-02T11:55:52.753 に答える