SELECT 쿼리에서 산술 오버플로


9

간단한 SELECT 문에서 산술 오버플로가 발생했습니다. 쿼리는 아래와 같습니다.

SELECT [SaleValue] FROM Sales

[SaleValue]데이터 유형이었으며 decimal(9,0)계산 열이 아닙니다.

이런 일이 발생한 이유는 열에이 필드에 지정된 데이터 유형보다 값이 GREATER 인 행이 있었기 때문입니다 (예 :) decimal(10,0).

열의 크기를 늘릴 때만 선택을 할 수있었습니다. 해당 테이블에는 두 개의 다른 열과 행에 다른 두 개의 인스턴스가 있습니다.

이 상황은 어떻게 가능 했습니까? 범위를 벗어난 값은 처음에 열에 어떻게 저장 되었습니까?

Microsoft SQL Server를 사용하고 있습니다. 이것은 뷰가 아닌 기본 테이블입니다.


1
내가 이것을 강제로 생각할 수있는 유일한 방법은 DAC를 통해 시스템 테이블을 편집하는 것입니다. 그럼에도 불구하고 그것이 잘 작동하는지 (또는 가능할 수도 있음) 확실하지 않습니다. 그 외에는 우리 자신을 위해이 상황을보기 위해 실제로 재현 스크립트가 필요하며 가능하다면 재현을 쉽게 만드는 데 몇 년이 걸릴 수 있습니다.
Damien_The_Unbeliever

더 나쁜, 단지 9/10의 저장 크기에 대한 컷 오버 포인트는 것을 기억 decimal- A는 decimal(9,0)5 바이트하는 차지해야 decimal(10,0)내가 덜 가능성이 당신이 가지고 있지 때문에 시스템 테이블을 편집을 통해이 작업을 수행 할 수 있다고 생각합니다 그래서 9 각 행의 데이터에 대한 올바른 스토리지 크기
Damien_The_Unbeliever

1
@Damien_The_Unbeliever 생식 방법을 모른다. 무슨 일이 있었는지 알아내는 데 1 시간이 걸렸습니다. 그것을 보는 것은 마른 물이나 차가운 열을 보는 것과 같았습니다. 솔직히 말해서, 그것은 나를 혼란스럽게했습니다.

답변:


15

예를 들어 SQL Server 2005 및 이후 버전에서 DBCC 오류 2570 문제 해결에 설명 된 것처럼 여러 가지 방법으로 발생할 수 있습니다 .

다음과 같은 이유로 유효하지 않거나 범위를 벗어난 데이터가 이전 버전의 SQL Server 데이터베이스에 저장되었을 수 있습니다.

  • bcp 유틸리티와 같은 대량 삽입 방법을 사용하는 동안 소스에 유효하지 않은 데이터가 있습니다.
  • SQL Server에 대한 RPC 이벤트 호출을 통해 잘못된 데이터가 전달되었습니다.
  • 실제 데이터 손상의 다른 잠재적 원인으로 인해 열 값이 유효하지 않은 상태가되었습니다.

이 기사에는 주제에 대한 유용한 정보가 많이 있습니다. 기본 사항은 설명서 DBCC CHECKDBDATA_PURITY특히 옵션을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.