SQLServer 2008 R2를 사용하고 있습니다. 나는 두 개의 테이블을 가지고 있는데, 첫 번째 테이블은 속성 테이블이다. 두 번째 테이블에는 특성 테이블을 참조하는 열이 있습니다. 두 테이블은 varchar(32)
열을 사용하여 조인됩니다.변환/캐스트 오류, NVARCHAR에서 INT
#tblA #tblB
--------------------- ---------------------
attrib varchar(32) <---------> attrib varchar(32)
val nvarchar(255) [other fields]
[other fields]
는 쿼리는 테이블을 조인하고 #tblA.val
int
int로서 캐스트 :
create table #tblA (attrib varchar(32), val nvarchar(255) /*, other fields */)
insert into #tblA values ('vase', 'red'), ('x', '323'), ('y', '615')
create table #tblB (attrib varchar(32) /*, other fields */)
insert into #tblB values ('x'), ('y')
select b.*, cast(a.val as int) as int_val
from #tblA a inner join #tblB b on a.attrib = b.attrib
drop table #tblB, #tblA
이 예제는 작동합니다,
attrib int_val
-------------------------------- -----------
x 323
y 615
을 그러나 나는 내 생산 테이블에 대해 동일한 쿼리를 실행할 때 수천 개의 레코드가있는 경우 오류가 발생합니다. nvarchar 값 'vase'를 데이터 유형 int로 변환 할 때 변환이 실패했습니다. 내 생산 쿼리에서 cast()
을 제거하면
, 난 단지 정수 값을 포함 열 val
에 대한 반환 된 데이터를 볼 수 있습니다.
왜 SQL Server는 반환 된 데이터 집합의 일부가 아닌 값을 변환하려고합니까? 심지어 cast(a.val as int)
외에도 선택 목록에 a.val
을 포함하면 변환 오류가 없습니다. 이걸 본 사람 있어요? SQL Server의 버그 일뿐입니까?
BTW - convert(int, a.val)
을 사용하면 cast(a.val as int)
과 같은 문제가 있습니다.
위의 주어진 데이터를 사용하여 일치하는 행을 가져 오지 않아야합니다. 두 번째 테이블 삽입을 #tblB 값 ('꽃병')에 삽입하도록 변경하면 ('아래') - 오류가 올바르게 발생합니다. – NoChance
죄송합니다 - 질문을 게시하기 전에 예제를 수정했습니다. '상단'과 '하단'이 여전히 #tblB에 삽입되었음을 알지 못했습니다. 나는 'x'와 'y'를 사용하기로했다. –
왜 그런지 모르겠지만 비 숫자 데이터 (예 : 일부 데이터에는 표시되지 않는 특수 문자가있을 수 있음) 또는 선행 공백 또는 널 값과 일치하는 행이있을 수 있습니다. 또 다른 가능성은 일치 된 행의 값이 int 한계를 초과 할 수 있습니다. 나는이 두 가지 사례를 쉽게 확인할 수 있다고 생각합니다. – NoChance