SQL Server 의 데이터 형식 암시 적 변환 문제

이 글 을 쓸 때 는 어떻게 이름 을 지어 야 할 지,어떻게 분류 해 야 할 지 정말 몰 랐 다.이것 은 동료 가 만난 사례 로 사례 가 비교적 복잡 하 다.여기 서 실 을 뽑 아 고 치 를 벗 기 고 간단 한 사례 만 만들어 이 문 제 를 보 여 준다.우 리 는 먼저 테스트 데 이 터 를 구성 하고 다음 과 같다.

 CREATE TABLE TEST
( 
 ID INT, 
 GOOD_TYPE VARCHAR(12),
 GOOD_WEIGHT NUMERIC(18,2)
)
INSERT INTO dbo.TEST
VALUES( 1, 'T1',1.27) 
SELECT GOOD_TYPE,
  CASE WHEN ( GOOD_TYPE = 'T1' ) THEN 99.1 + SUM(GOOD_WEIGHT)
    ELSE CEILING(SUM(GOOD_WEIGHT))
  END AS GrossWeight ,
  SUM(GOOD_WEIGHT) AS NetWeight
FROM dbo.TEST
GROUP BY GOOD_TYPE;

위 에서 보 듯 이 왜99.1 + SUM(GOOD_WEIGHT)100 이 되 었 습 니까?원시 SQL 은 매우 복잡 합 니 다.우 리 는 여러 가지 요 소 를 분석 하고 제거 한 후에 요령 을 터득 하지 못 했 습 니 다.여러 가지 고생 속 에서 이렇게 전환 하면(아래 캡 처 참조)괜 찮 습 니 다.나중에 분석 한 결과 CASE WHEN 안의 서로 다른 데이터 유형 이 암시 적 인 전환 을 초래 한 것 같 습 니 다.솔직히 CASE WHEN 에 데이터 유형의 잠재 적 인 전환 이 존재 하 는 지 주의 하지 않 았 습 니 다.그런데 왜 꼭 NUMERIC 에서 INT 로 바 뀌 었 을까요?INT 가 아니 라 NUMERIC 로 바 뀌 었 습 니 다.솔직히 관련 문서 의 공식 을 보지 못 했 습 니 다.만약 에공식 문서:

서로 다른 데이터 형식의 표현 식 을 연산 자로 조합 한 후 우선 순위 가 낮은 데이터 형식 은 우선 우선 우선 순위 가 높 은 데이터 형식 으로 변환 합 니 다.이 변환 이 지원 하 는 암시 적 변환 이 아니라면 오 류 를 되 돌려 줍 니 다.같은 데이터 형식의 연산 자 를 조합 할 때 연산 결 과 는 이 데이터 형식 입 니 다.
그리고 우 리 는 알 고 있 습 니 다.그러나 진짜Decimal 아직 잘 모 르 고 정확도 요구 가 높 은 보고서 에서 이런 현상 은 Bug 와 같은 갑 작 스 러 운 현상 이 나타난다.조심해 야 돼!
참고 자료:
https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-server-2017
https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-conversion-database-engine?view=sql-server-2017
총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 SQL Server 의 데이터 형식 암시 적 전환 문제 입 니 다.여러분 께 도움 이 되 셨 으 면 합 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기