2013-10-18 4 views
0

SQLServer 2008 R2를 사용하고 있습니다. 나는 두 개의 테이블을 가지고 있는데, 첫 번째 테이블은 속성 테이블이다. 두 번째 테이블에는 특성 테이블을 참조하는 열이 있습니다. 두 테이블은 varchar(32) 열을 사용하여 조인됩니다.변환/캐스트 오류, NVARCHAR에서 INT

#tblA        #tblB 
---------------------    --------------------- 
attrib varchar(32) <---------> attrib varchar(32) 
val nvarchar(255)     [other fields] 
[other fields] 

는 쿼리는 테이블을 조인하고 #tblA.valint 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)과 같은 문제가 있습니다.

+0

위의 주어진 데이터를 사용하여 일치하는 행을 가져 오지 않아야합니다. 두 번째 테이블 삽입을 #tblB 값 ('꽃병')에 삽입하도록 변경하면 ('아래') - 오류가 올바르게 발생합니다. – NoChance

+0

죄송합니다 - 질문을 게시하기 전에 예제를 수정했습니다. '상단'과 '하단'이 여전히 #tblB에 삽입되었음을 알지 못했습니다. 나는 'x'와 'y'를 사용하기로했다. –

+0

왜 그런지 모르겠지만 비 숫자 데이터 (예 : 일부 데이터에는 표시되지 않는 특수 문자가있을 수 있음) 또는 선행 공백 또는 널 값과 일치하는 행이있을 수 있습니다. 또 다른 가능성은 일치 된 행의 값이 int 한계를 초과 할 수 있습니다. 나는이 두 가지 사례를 쉽게 확인할 수 있다고 생각합니다. – NoChance

답변

0

본인의 문제와 관련이 있다고 생각합니다. 수락 된 답변을 확인하십시오. SQL Server 버그가 아닙니다. 이는 작업 순서가 절차 적이지 않기 때문에 (대부분은 분명하지 않음). 이 도움이

Cast Order in SQL Server Join

희망.

+0

정말 도움이되었습니다. 그것은 내가 찾고 있던 것입니다. 고맙습니다! –

관련 문제