문제

응용 프로그램에서는 사용자가 숫자에 대한 다른 데이터베이스 열을 사용하여 산술 표현식 (+ - * /)을 입력 할 수있게되며, 이는 응용 프로그램에 의해 구문 분석되고 데이터베이스에 계산 된 열로 작성됩니다.

그러나 사용자가 예외를 유발할 수있는 표현식을 만들 수 있도록하는 데 발생하는 문제가 있습니다. select * 제로 분할, 산술 오버 플로우 및 내가 아직 만나지 못한 다른 표현과 같은 테이블 생각한다 그게 다야).

데이터베이스에 예외가 발생합니다 select * 절대적으로 치명적일 것입니다. 차라리 오류가 발생하기 쉬운 데이터가 있으면 우아하게 실패 할 수있는 것으로 표현을 다시 작성하려고합니다.

제로별로 나누기의 경우 솔루션은 매우 간단합니다.

add [Col] as case {divisor} when 0 then N'DIVIDE-BY-ZERO' else {expression} end

내 질문은 산술 오버플로를 위해 무엇을 할 수 있습니까? 열에 이층 또는 명백히 잘못된 데이터를 보여주는 것은 문제가되지 않지만 예외를 던지는 것입니다.

도움이 되었습니까?

해결책

나는 당신이 실제로 당신의 목표에 더 가까워지지 않는 답을 받아들이는 것을보고 싫어합니다.

조금 도움이 될 수있는 별도의 답변으로 ~할 수 있다 계산 된 열을 (결정 론적) 스칼라 UDF라고 부릅니다.

예를 들어, 여기

따라서 계산 된 열을 만들려면 열을 생성 된 UDF (또는 여러 UDF)로 전달하고 작업을 수행하십시오. 스칼라 UDF에서는 문제를 해결하기 위해 많은 코드를 가질 수 있지만 여전히 사용할 수 없습니다. TRY/CATCH. 스칼라 UDF에서 할 수있는 일은 캐치 케이스와 적절한 답변을 반환하는 것입니다 (아마도 널을 버리는 것).

그러나 성능은 될 것입니다 매우 스칼라 UDF (비 연개 인라인 계산 된 열 대 UDF에 대해 확실하지 않으면 주로 지속 된 경우)이므로 열을 지속하는 것을 고려하고 데이터베이스에서 공간을 사용하고 인서트 및 업데이트를 작성하는 것을 진지하게 고려할 수 있습니다. 조금 느립니다. 그것은 큰 트레이드 오프입니다.

다른 팁

구문 분석 기술이 있으므로 표현을 다시 작성하여 모든 잠재적 인 문제를 제로로 나누고 오버플로, 다른 유형으로 업 캐스트하는 등 다양한 사례 진술로 모든 잠재적 문제를 포착 할 수 있습니다.

그러나이 도구 ND 사용자가 Edge 표현식을 검토하고 테스트 할 책임이없는 경우이 도구가 코드 생성 도구 ND가 아닌 한 스키마의 일부로 데이터베이스에 넣는 것이 좋은 아이디어라고 생각하지 않기 때문에 그렇게하지 않을 것입니다. 마치 원래 데이터베이스 설계에 포함 된 것처럼 조건.

이미 표현식을 구문 분석하고 있다면 클라이언트 측에서도 이것을 컴파일하고 행별로 오류를 처리합니다.

예외를 사용하여 시도/캐치 행별로가 아니라 전부 또는 전혀 시나리오입니다.

예외를 포착하는 것은 어떻습니까? 일반적으로 예외는 물론 산술 오버 플로우의 가능한 모든 원인을 감지하는 것은 어려운 것 같습니다.

예외적으로, 원래 사용자 정의 된 것과 호환되는 말도 안되는 결과 세트를 반환 할 수 있습니다.

begin try
    select exp(999)
end try
begin catch
    select 1
end catch 

성능이 중요하다면 트리거 또는 색인보기를 사용하여 데이터가 삽입, 업데이트 또는 삭제 될 때 계산을 저장하십시오.

성능이 중요하지 않은 경우 스칼라 값 기능을 사용하십시오.

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