2015-01-06 3 views
0

원시 데이터를 구문 분석 할 저장 프로 시저를 만들었습니다. 아래 코드는 저장 프로 시저의 일부입니다. 나는 그것을 테스트하고 오류 '데이터 유형 varchar를 부동으로 변환하는 중 오류가 발생했습니다.'. KM2의 원시 데이터가 다른 경우와 다른 경우 모두 변경됩니다.구문 분석시 데이터 형식 varchar를 float로 변환하는 중 오류가 발생했습니다.

누군가가 나를 올바르게 도와 줄 수 있습니까? 모든 도움 사람을 미리 감사드립니다. 내가으로 실행에 보관

SELECT [Account] = LEFT('351856040520298,241111;1G,141007034741,A,1430.4280N,12100.0551E,0.0,330,0.8,20000000;2G,141007034741,11,22.8,12.87,04.09,273342044.3',CHARINDEX(',','351856040520298,241111;1G,141007034741,A,1430.4280N,12100.0551E,0.0,330,0.8,20000000;2G,141007034741,11,22.8,12.87,04.09,273342044.3') - 1), 
    [TrxDateTime] = cast(stuff(stuff(stuff((SUBSTRING('351856040520298,241111;1G,141007034741,A,1430.4280N,12100.0551E,0.0,330,0.8,20000000;2G,141007034741,11,22.8,12.87,04.09,273342044.3', 27, 12)), 7,0,' '), 10,0,':'), 13,0,':') as datetime), 
    [PhilTime] = GETDATE(), 
    [GPSStatus] = CASE WHEN(SUBSTRING('351856040520298,241111;1G,141007034741,A,1430.4280N,12100.0551E,0.0,330,0.8,20000000;2G,141007034741,11,22.8,12.87,04.09,273342044.3', 40, 1) = 'A') 
       THEN 'OK' 
       ELSE 'Message Not Valid' END, 
    [Lat] = cast(SUBSTRING('351856040520298,241111;1G,141007034741,A,1430.4280N,12100.0551E,0.0,330,0.8,20000000;2G,141007034741,11,22.8,12.87,04.09,273342044.3', 42, 9) as float)/100, 
    [Long] = cast(SUBSTRING('351856040520298,241111;1G,141007034741,A,1430.4280N,12100.0551E,0.0,330,0.8,20000000;2G,141007034741,11,22.8,12.87,04.09,273342044.3', 53, 10) as float)/100, 
    [Speed2] = cast(SUBSTRING('351856040520298,241111;1G,141007034741,A,1430.4280N,12100.0551E,0.0,330,0.8,20000000;2G,141007034741,11,22.8,12.87,04.09,273342044.3', 65, 1) as float)*1.852/1000, 
    [ENGINE] = CASE WHEN (SUBSTRING('351856040520298,241111;1G,141007034741,A,1430.4280N,12100.0551E,0.0,330,0.8,20000000;2G,141007034741,11,22.8,12.87,04.09,273342044.3', 77, 1) = '2') 
       THEN 'ON' 
       ELSE 'OFF' END, 
    [KM2] = CASE WHEN(right('351856040520389,241111;1G,141209203228,A,1437.3980N,12103.6893E,0.0,44,0.8,01004000', 11) like '%,%') 
       THEN 'NULL' 
       --ELSE 'BDADADADAD' END, 
       ELSE round(cast(right('351856040520389,241111;1G,141209203228,A,1437.3980N,12103.6893E,0.0,44,0.8,01004000', 11)as float)/3600, 0, 1) END, 
    [PlateNo] = NULL, 
    [ProcStatus] = '0'; 

오류는 여기에 이중 문제가 발생하는

Msg 8114, Level 16, State 5, Line 1 
Error converting data type varchar to float. 
+2

변경 'THEN'에 NULL''는'THEN NULL' ... –

+1

또한, 난 정말 당신이 이제까지이 같은 데이터를 저장하지 않았 으면 란에 –

답변

3

을 오류가 [KM2]의 당신의 정의입니다. 다음에 따라 NULL로 'NULL'을 unquoting하여 변경 :

... 
[KM2] = CASE WHEN(right('351856040520389,241111;1G,141209203228,A,1437.3980N,12103.6893E,0.0,44,0.8,01004000', 11) like '%,%') 
      THEN NULL 
      ELSE round(cast(right('351856040520389,241111;1G,141209203228,A,1437.3980N,12103.6893E,0.0,44,0.8,01004000', 11)as float)/3600, 0, 1) END, 
... 
+0

CSV 파일에서 가져 오는 것처럼 보이는 데이터입니다. BULK INSERT를 사용하여이 원시 데이터를 테이블로 가져 오는 것이 훨씬 더 빠릅니다 (http://msdn.microsoft.com/en-au/library/ms188365.aspx 참조). 저장된 proc은 훨씬 더 간단해진다. 그런 다음 SP로 새 테이블을 쿼리합니다. SP는 매우 비효율적 인 파서입니다. – JohnS

1

입니다. 당신은 두 가지 중 하나를 변경해야

--ELSE 'BDADADADAD' END, 
ELSE 
round(cast(right('351856040520389,241111;1G,141209203228,A,1437.3980N,12103.6893E,0.0,44,0.8,01004000', 11)as float)/3600, 0, 1) END, 

코드의 섹션을 수 있습니다. IF에서 NULL까지의 'NULL' 또는 ELSE의 OR 성명서는 Varchar을 반환해야합니다. 그러나 귀하의 ELSE이 현재 양식에 부딪치게된다면 아래에서 설명했기 때문에 여전히 문제가됩니다. 예를 들어,이 작품 : ifelse 반환 동일한 데이터 유형 및 else가 히트하지 않기 때문에

select CASE WHEN(right('351856040520389,241111;1G,141209203228,A,1437.3980N,12103.6893E,0.0,44,0.8,01004000', 11) like '%,%') 
      THEN 'Null' 
      ELSE cast(round(cast(right('351856040520389,241111;1G,141209203228,A,1437.3980N,12103.6893E,0.0,44,0.8,01004000', 11)as float) 
      /3600, 0, 1)as varchar) END 

의미가 있습니다. 확인해보세요 -이 작품도 마찬가지입니다 :

select CASE WHEN(right('351856040520389,241111;1G,141209203228,A,1437.3980N,12103.6893E,0.0,44,0.8,01004000', 11) like '%,%') 
      THEN 1 
      ELSE cast(cast(right('351856040520389,241111;1G,141209203228,A,1437.3980N,12103.6893E,0.0,44,0.8,01004000', 11)as float) 
      /3600, 0, 1) END 

지금. 이 부분에서 보면 : -이 cast('.8,01004000' as float)

문제를 - right('351856040520389,241111;1G,141209203228,A,1437.3980N,12103.6893E,0.0,44,0.8,01004000', 11) 가 지금의 .8,01004000

를 반환합니다, 당신은 cast에이 결과를 묶으 ".8,01004000"부동의 문자열 표현으로 보이지 않는다.

이제

select CAST('.8,01004000' as float)를이 체크 아웃 - (오류 데이터 유형 VARCHAR가 떠 변환) select CAST('.801004000' as float) 작동하지 않음 - 작업

+0

아니요,이 특정 데이터의 경우 해당 CASE 표현식의 시작 부분에 NOT LIKE '%, %'로 필터링되어 ELSE에 도달하지 못했습니다. float로 변환하려고 시도하는 문자열이 'NULL'입니다. –

+0

@AaronBertrand 그것은 당신이 어떻게 문제를 보느냐에 달려 있습니다. 'ELSE' 부분이 'varchar'를 반환하면'IF' 부분의''NULL ''이 작동합니다. 여기서 어떤 부분이 잘못되었는지는 분명하지 않습니다. 따라서 두 번째 파일을 선택했습니다 –

관련 문제