2012-08-01 3 views
0

나는 사람들이 우리가 재고가없는 품목을 주문하는 것을 막기 위해 check 제약 조건을 가진 보류중인 주문 테이블을 가지고 있습니다. 삽입 기능의 사용 여부를 결정하는 카운터 기능을 만들어야했습니다. 인벤토리에 남아있는 항목이 하나있을 때까지 작동하며 항목이 재고가 없다는 메시지가 나타납니다. 더티 읽기 문제라고 생각했지만 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 테이블의 커밋되지 않은 데이터를 건너 뛸 것이라고 생각 했습니까? 검사 제약 조건에 대해 무시됩니까? –

+0

*** 항상 *** 자신 만의 변경 사항을 볼 수 있습니다. 힌트가 그 영향을 미칠 수 있습니다. – RBarryYoung

0

예 그렇습니다뿐만 아니라 코드에서 몇 나누기가 총 문 @ 당신의 세트는 모순이다.

+0

자세히 설명해 주시겠습니까? 그들은 어떤면에서 모순이 되는가? 코드의 중단은 무엇입니까? –

관련 문제