문제

다음 쿼리를 실행하고 있습니다.

Select guiPolygonID, dbo.fn_Yval(p1X, p1Y, p2X, p2Y, 4.003318)
From [vPolygonSegments]
Where dbo.fn_Yval(p1X, p1Y, p2X, p2Y, 4.003318) > 0

함수의 중요한 부분 fn_yval (모든 매개 변수는 float 유형입니다) :

set @m = (@p2Y - @p1Y)/(@p2X - @p1X)
set @b = @p1Y - (@m*@p1X)
set @result = (@m*@xval+@b)

보기 vpolygonessments에는 p1x = p2x (해당 레코드가 제외됨)의 레코드가 포함되어 있지 않습니다. 그러나 쿼리를 실행하면 SQL Server는 "0 에러 오류로 나누는"오류를 반환합니다. 흥미롭게도, 처음 두 줄만 실행하면 (Where 절없이) 쿼리는 결과가 잘 반환됩니다.

이 문제를 해결하려면 어떻게해야합니까? 또는이 동작의 원인은 무엇입니까?

편집하다:내 견해는 다음과 같습니다.

Select P1.guiPolygonID,
    P1.decX as p1X, P1.decY as p1Y,
    P2.decX as p2X, P2.decY as p2Y
From PolygonPoints P1, PolygonPoints P2
Where P1.guiPolygonID = P2.guiPolygonID
    and (
        P1.lPointNumber - P2.lPointNumber = 1
        or (
            -- Some other unimportant code
        )
    )
    and P1.decX <> P2.decX
도움이 되었습니까?

해결책

여기서 문제는 선택 원인의 함수가 WHERE 절의 기능이 평가되기 전에 평가된다는 것입니다. 이 조건은 매우 드물지만 가능하므로 코딩해야합니다. 기능이 제로 상황으로 안전하게 나눌 수 있도록 기능을 수정하는 것이 좋습니다. 이 선을 변경하십시오 :

set @m = (@p2Y - @p1Y)/(@p2X - @p1X)

이에:

set @m = (@p2Y - @p1Y)/NullIf((@p2X - @p1X), 0)

@p2x- @p1x = 0 인 경우 Nullif 함수는 null을 반환합니다. 그 후, @M은 다른 모든 값과 마찬가지로 NULL이됩니다. 아마도 함수는 null을 반환 할 것입니다.

당신의 Where 절에 ... 당신은 ...

Where dbo.fn_Yval(p1X, p1Y, p2X, p2Y, 4.003318) > 0

함수가 NULL을 반환하면 0과 비교하지 않으며 어쨌든 필터링됩니다.

다른 팁

Joel Coehoorn이 지적했듯이, 그것이 아마도 문제 일 가능성이 높습니다. 아래 쿼리는 문제를 피해야하지만 문제는 기능 자체 내에서 가장 잘 고정됩니다.

Select guiPolygonID, dbo.fn_Yval(p1X, p1Y, p2X, p2Y, 4.003318)
From [vPolygonSegments]
Where p2X <> p1X and dbo.fn_Yval(p1X, p1Y, p2X, p2Y, 4.003318) > 0

쿼리에 대한보기가 어떻게 구체화되는지와 관련이 있다고 생각합니다. 해당 기능을 WHERE 절에 추가합니다 본질적으로 최적화기 가이 필터를 이전에 소스 데이터에 적용하도록 선택할 수 있도록보기의 소스 쿼리에 추가합니다. P1.decX <> P2.decX.

어쨌든, 당신은 동일한 제약 조건이없는 다른 곳에서 해당 기능을 재사용하고 싶은시기를 모릅니다. 나쁜 데이터를 미리 처리하는 방법에 대한 계획을 세우는 것이 가장 좋습니다. 그만큼 NullIf 이 경우 제안은 좋은 것 같습니다.

문제는 @p2x = @p1x 일 때 발생합니다. 이 경우 무슨 일이 일어날 것으로 예상됩니까?

나는 이것이 어떤 식 으로든 질문에 대답 할 것이라는 것을 모르겠지만, 각 레코드에 대해 fn_yval을 두 번 평가하고 있습니다. 기능의 결과를보기의 열로 만들지 않겠습니까? 그러면, 당신의 위치 절은 "where yval> 0"과 같은 것일 수 있습니다.

편집 : 호기심으로 인해 FN_YVal은 부작용이 없습니다.

결합 또는보기가 관련 될 때 WHERE 절을 사용하여 0으로 나눌 수있는 데이터를 제거하려고 시도하는 것이 문제가되는 것을 발견했습니다. 조인 절에서 데이터를 필터링하거나 함수에서 필터링하십시오.

업데이트 : "G Mastros"가 쓴 이유가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top