답변:
그것은 단지 문서화 된 행동입니다. 아무도 설정을 엉망으로 생각하지 않습니다.
MSDN의 데이터 형식 우선 순위 를 참조하십시오 .
연산자가 다른 데이터 유형의 두 표현식을 결합 할 때 데이터 유형 우선 순위 규칙은 우선 순위가 낮은 데이터 유형이 우선 순위가 높은 데이터 유형으로 변환되도록 지정합니다.
주석에서 언급했듯이 빈 문자열은 숫자 유형에서 0으로, 날짜로 변환되면 1900-01-01 00 : 00 : 00.000으로 변환됩니다.
편집 : 당신의 진짜 문제는 당신의 디자인이 다른 데이터 유형의 필드에 참여해야한다는 것입니다. 이 문제를 해결하는 유일한 방법은 조인 절을 변환하여 쿼리 성능을 저하시키는 것입니다. 주요 문제는 아마도 스키마 디자인에 있습니다.
편집 : 채팅으로 이동 코멘트에 많은 토론이있었습니다. 그러나 빈 문자열을 다른 데이터 형식으로 변환하면 임의의 값이 생성됩니다.
이 코드는 :
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
이 출력을 생성합니다.
0
0
1900-01-01
1900-01-01 00:00:00.000
그러면이 동작이 다른 선행 데이터 유형간에 일관성이있을 것으로 예상 할 수 있으며 0을 날짜로 변환하면 동일한 임의의 값이 생성되지만 그렇지 않습니다.
SELECT CONVERT(date, 0)
생산
데이터 유형 int에서 날짜로의 명시 적 변환은 허용되지 않습니다.
지원되는 전환이 아니기 때문에
동안
SELECT CONVERT(datetime, 0)
보고
1900 년 1 월 1 일 00:00:00
예, 이상하고 임의적이지만 실제로 문서화되고 설명 가능합니다.
CAST('' AS INT)
-> 0이 어딘가에 문서화되어 있습니까? 참조를 추가하면 좋을 것입니다.