2012-08-01 22 views
0

我有一個檢查約束的掛單表,以防止人們訂購我們沒有庫存的物品。這要求我創建一個計數器函數來決定插入是否可以發生。它會一直運行,直到庫存中剩下1件商品,然後我收到一條消息,表明我們缺貨。我認爲這是一個骯髒的閱讀問題,但即使在引入ReadPast提示後,我仍然看到這種行爲。有沒有其他因素導致這個問題?或者我需要設置不同的隔離級別?ms sql server是否不在函數中使用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; 

回答

1

數學已關閉。相反的:

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

它應該是:

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

那是因爲你的約束功能可以看出,您正試圖添加和計數它的行。

+0

我認爲WITH(READPAST)會跳過PendingSprokOrders表中未被取消的數據?檢查約束是否被忽略? – 2012-08-01 16:49:00

+0

你可以***總是看到你自己的變化。沒有提示會影響到這一點。 – RBarryYoung 2012-08-01 16:49:50

0

是的,但是你的set @ total語句是矛盾的,在你的代碼中也有幾次中斷。

+0

你能詳細說明一下嗎?它們以什麼方式相互矛盾?代碼中的中斷是什麼? – 2012-08-01 15:59:04

相關問題