0

在庫のないアイテムを注文できないようにするチェック制約付きの保留中の注文テーブルがあります。これにより、挿入が発生するかどうかを判断するカウンター関数を作成する必要がありました。在庫が 1 アイテムになるまで機能しますが、在庫切れのメッセージが表示されます。ダーティ リードの問題だと思っていましたが、ReadPast ヒントを挿入した後でも、この動作が見られます。この問題を引き起こしている他の要因はありますか?または、分離レベルを別の方法で設定する必要がありますか?

sprokID を使用してこの関数を呼び出してみましたが、true が返されるため、挿入中にダーティ リードが行われていると考えています。

ALTER TABLE [dbo].[PendingSprokOrders]  WITH CHECK ADD  CONSTRAINT [CK_SprokInStock] CHECK  (([dbo].[SprokInStockCount]([SprokID])=(1)))

FUNCTION [dbo].[SprokInStockCount] ( @SprokId INT )
RETURNS INT
AS 
    BEGIN 

        DECLARE @Active INT
        SET @Active = ( SELECT  COUNT(*)
                        FROM    [PendingSprokOrders] AS uac   WITH(READPAST)
                        WHERE   uac.SprokID = @SprokId
                      ) 
        DECLARE @Total INT
        SET @Total = ( SELECT
                                ISNULL(InStock, 0)
                       FROM     SprokInvetory
                       WHERE    id = @SprokId
                     )


        DECLARE @Result INT

        IF @Total - @Active > 0 
            SET @Result = 1
        ELSE 
            SET @Result = 0  
        RETURN @Result;
    END;
4

2 に答える 2

1

数学はオフです。それ以外の:

    IF @Total - @Active > 0 
        SET @Result = 1
    ELSE 
        SET @Result = 0  

そのはず:

    IF @Total - @Active > -1 
        SET @Result = 1
    ELSE 
        SET @Result = 0  

これは、制約関数が、追加しようとしている行を認識してカウントしているためです。

于 2012-08-01T15:55:29.020 に答える
0

はい、そうですが、 set@total ステートメントは矛盾しており、コードにいくつかの中断があります。

于 2012-08-01T15:48:50.210 に答える