1

水曜日には完全に機能していたストアド プロシージャが、適切に機能しなくなりました。私はコードを変更していませんが、何らかの理由で同じように動作していません。

動作しないコード スニペットは次のとおりです。

WITH Minimum AS (SELECT DataTable.PortID, [Rating Max],
    CASE When [Rating Max] <= [Sector Max] And [Rating Max] <= [ConcAfterUnwritten] And [Rating Max] <= [NatAfterUnwritten] And [Rating Max] <= [CashMaxAfterUnwritten] And [Rating Max] <= MatAfterUnwritten And [Rating Max] <= MatAfterInitialConcentration  Then [Rating Max]
         When [Sector Max] <= [ConcAfterUnwritten] And [Sector Max] <= [NatAfterUnwritten] And [Sector Max] <= CashMaxAfterUnwritten And [Sector Max] <= MatAfterUnwritten And [Sector Max] <= MatAfterInitialConcentration Then [Sector Max]
         When ConcAfterUnwritten <= NatAfterUnwritten And ConcAfterUnwritten <= CashMaxAfterUnwritten And ConcAfterUnwritten <= MatAfterUnwritten And ConcAfterUnwritten <= MatAfterInitialConcentration Then ConcAfterUnwritten
         When NatAfterUnwritten <= CashMaxAfterUnwritten And NatAfterUnwritten <= MatAfterUnwritten And NatAfterUnwritten <= MatAfterInitialConcentration Then NatAfterUnwritten
         When CashMaxAfterUnwritten <= MatAfterUnwritten And CashMaxAfterUnwritten <= MatAfterInitialConcentration Then CashMaxAfterUnwritten
         When MatAfterUnwritten <= MatAfterInitialConcentration Then MatAfterUnwritten
         Else MatAfterInitialConcentration
         End As [Min Of 5 Restrictions]
FROM DataTable)
UPDATE DataTable
Set 
    DataTable.MinOf5Restrictions = Minimum.[Min Of 5 Restrictions],
    DataTable.MktValueAllocation = IIF(Minimum.[Min Of 5 Restrictions] < DataTable.MatAfterInitialConcentration, 0, DataTable.MatAfterInitialConcentration),
    DataTable.ModelParAmount = IIf([MktValueAllocation]=0,0,Round([MktValueAllocation]/([$Px+Acc]*10)/5,0,1)*5),
    DataTable.AllocatedPar = IIF(DataTable.ModelParAmount = 0, 0, ParLots.AllocatedPar),
    DataTable.[Check Cash And Concentration] = IIf(DataTable.[AllocatedPar]*[$Px+Acc]*10>[MinOf5Restrictions],[ModelParAmount],DataTable.[AllocatedPar]),
    DataTable.[Final After State Switch] =  IIf([StateOnly]='TRUE',IIf([RestrictionType]='Specific',[Check Cash And Concentration],0),[Check Cash And Concentration])
FROM 
    ((DataTable INNER JOIN Minimum ON DataTable.PortID = Minimum.PortID) LEFT JOIN ParLots ON DataTable.ModelParAmount = ParLots.ModelPar) INNER JOIN TestSet ON DataTable.PortID = TestSet.PortID, Main;

私の現在の問題は、必要な結果を得るためにクエリを 6 回実行する必要があることです。基本的に、UPDATEステートメントは、6つすべてを一度に実行するのではなく、実行するたびに1つの列のみを更新しているようです。最初に実行されたときに MinOf5Restrictions は入力されますが、他の列は入力されず、2 回目は MktValueAllocation が入力されますが、最後の 4 つはまだ空です。

なぜこれが考えられるのでしょうか?私はそれを6つの異なるUPDATEステートメントに分けることができると思いますが、特に以前に動作していたので、そうする必要がない場合はむしろしたくありません。

ありがとう

4

1 に答える 1

2

そこにあるクエリは非常に複雑で、テーブルのスキーマとテーブル内の値を知らなければ、問題を診断するのは困難です。ただし、更新に関する問題を通常デバッグする方法は、それを選択に変更し、返された値が期待どおりであり、更新したいものであるかどうかを確認することです。したがって、クエリを次のように更新します(スキーマがないため、これが機能することを確認できませんでしたが、そうでない場合はアイデアを提供する必要があります)。

WITH Minimum AS 
(
    SELECT 
        DataTable.PortID
       ,[Rating Max]
       ,CASE 
            When [Rating Max] <= [Sector Max] And [Rating Max] <= [ConcAfterUnwritten] And [Rating Max] <= [NatAfterUnwritten] And [Rating Max] <= [CashMaxAfterUnwritten] And [Rating Max] <= MatAfterUnwritten And [Rating Max] <= MatAfterInitialConcentration  Then [Rating Max]
            When [Sector Max] <= [ConcAfterUnwritten] And [Sector Max] <= [NatAfterUnwritten] And [Sector Max] <= CashMaxAfterUnwritten And [Sector Max] <= MatAfterUnwritten And [Sector Max] <= MatAfterInitialConcentration Then [Sector Max]
            When ConcAfterUnwritten <= NatAfterUnwritten And ConcAfterUnwritten <= CashMaxAfterUnwritten And ConcAfterUnwritten <= MatAfterUnwritten And ConcAfterUnwritten <= MatAfterInitialConcentration Then ConcAfterUnwritten
            When NatAfterUnwritten <= CashMaxAfterUnwritten And NatAfterUnwritten <= MatAfterUnwritten And NatAfterUnwritten <= MatAfterInitialConcentration Then NatAfterUnwritten
            When CashMaxAfterUnwritten <= MatAfterUnwritten And CashMaxAfterUnwritten <= MatAfterInitialConcentration Then CashMaxAfterUnwritten
            When MatAfterUnwritten <= MatAfterInitialConcentration Then MatAfterUnwritten
            Else MatAfterInitialConcentration
         End As [Min Of 5 Restrictions]
    FROM DataTable
)
SELECT
    Minimum.[Min Of 5 Restrictions] [MinOf5Restrictions],
    IIF(Minimum.[Min Of 5 Restrictions] < DataTable.MatAfterInitialConcentration, 0, DataTable.MatAfterInitialConcentration) [MktValueAllocation],
    IIf([MktValueAllocation]=0,0,Round([MktValueAllocation]/([$Px+Acc]*10)/5,0,1)*5) [ModelParAmount],
    IIF(DataTable.ModelParAmount = 0, 0, ParLots.AllocatedPar) [AllocatedPar],
    IIf(DataTable.[AllocatedPar]*[$Px+Acc]*10>[MinOf5Restrictions],[ModelParAmount],DataTable.[AllocatedPar]) [Check Cash And Concentration],
    IIf([StateOnly]='TRUE',IIf([RestrictionType]='Specific',[Check Cash And Concentration],0),[Check Cash And Concentration]) [Final After State Switch]
FROM 
    ((DataTable 
    INNER JOIN Minimum ON 
        DataTable.PortID = Minimum.PortID) 
    LEFT JOIN ParLots ON 
        DataTable.ModelParAmount = ParLots.ModelPar) 
    INNER JOIN TestSet ON DataTable.PortID = TestSet.PortID

さらにヘルプが必要な場合は、クエリを簡素化できると役立ちます (これを行うと、問題を見つけるのにも役立つ場合があります)。

于 2013-07-08T17:15:58.247 に答える