SSIS 소스가 2 개 이상의 소수점이있는 경우 문자열 (DT_STR)을 MONER (DT_STR)로 변환하는 방법

StackOverflow https://stackoverflow.com/questions/8885098

문제

24.209991과 같은 값이있는 소스 플랫 파일이 있지만 SQL Server에 유형으로로드해야합니다.DTS (내가 변환 중)에서, 그 값은 24.21로 만난다.SSIS에서 해당 필드를 어떻게 변환합니까?

지금, DT_STR에서 DT_CY에서 유형을 변경하고 있으며 '데이터 변환이 실패한 실행 오류가 발생합니다.열 "COL003"열에 대한 데이터 변환은 상태 값 2 및 상태 텍스트 "데이터 손실로 인해 값을 변환 할 수 없습니다.". '

데이터 변환 작업을 사용합니까?그리고 나서 뭐라구?

또한 소스 출력 열을 dt_numeric으로 설정 한 다음 DT_CY로 변환 한 다음 동일한 결과로 변환했습니다.

또한 DT_STR 필드 COL003을 (dt_numeric, 10,2) col003로 주조 한 다음 (dt_cy) col003_numeric으로 캐스팅하는 DT_STR 필드 COL003을 캐스팅했습니다.그것은 주조 오류가 발생합니다.

도움이 되었습니까?

해결책

플랫 파일은 DT_STR이되는 모든 필드에 기본값입니다.연결 편집에 대한 고급 옵션을 사용하여 숫자 필드가 float (DT_R4)로 가질 수 있습니다.그런 다음 플랫 파일 소스의 고급 편집 (데이터 흐름 탭의)에서 해당 출력 열을 Mone (DT_CY)으로 설정하십시오.

그런 다음 필드는 추가 변환없이 변환됩니다.문제는 소스 파일 정의를 DT_STR로 남기고있었습니다.

다른 팁

null 값이없는 경우 데이터 변환을 사용하고 재미있는 문자가 없는지 확인합니다 (예 : 200 달러 생성 오류).

필드에 null 또는 빈 필드가 있고 플랫 파일 소스를 사용하는 경우 "Return null value from source .."를 선택했는지 확인합니다.

내가 사용한 또 다른 트릭은 다음과 같습니다. 파생 열 변환의 (taxvalue != "" ? taxvalue : NULL(DT_WSTR,50)). (필드 만 바꿀 수 있음)

일반적으로 SSIS는 빈 문자열을 돈으로 적절하게 변환하지 않습니다.

내 시나리오에서 어떤 이유에서인지 OLE DB Destination는 실제로 DT_CY를 허용하도록 구성되었습니다 . 그러나이 형식으로 변환하면 (입력 및 대상 데이터의 길이와 관계없이 데이터가 도착했을 때 유전자 태그 코드인지 여부에 관계없이) 항상 동일한 문제가 발생했습니다.

데이터 뷰어를 추가 한 후 이것이 로케일과 관련이 있다는 결론을 내릴 수 있습니다. 여기 덴마크에서는 쉼표 (NULL)를 소수점 구분 기호로 사용하고 점 (,)을 천 단위 구분 기호로 사용합니다.

이것은 .와 같은 엄청난 숫자가 (382,939,291,293.38로 변환 된 후) DT_CY처럼 보일 것임을 의미합니다. 문제가 될 수 있을지 의심 스러웠지만 원래 의도했던 것과 반대 를하기로 결정했습니다.

382.939.291.293,38의 고급 설정으로 이동하여 OLE DB Destination 열의 유형을 DT_CY로 변경하기로 결정했습니다. 그런 다음 DT_STR 변환을 추가하고 다음 표현식을 입력하여 데이터가 목적지에 도착하기 전에 열을 변환했습니다.

Derived Column 여기서 REPLACE(SUBSTRING(Price, 2, 18), ",", ".")는 열의 이름입니다.

놀랍게도이 방법으로 문제가 해결되었습니다. 제 Price가 이제 데이터를 문자열로 전송하고 있다는 것을 알았 기 때문에 SQL Server가 완벽하게 이해했습니다.

이것은 버그라고 확신합니다! SQL Server 2008을 사용하고 있었으므로 이후 버전에서 해결되었을 수 있습니다. 그러나 나는 그러한 필수적인 것이 제대로 작동하지 않는 것이 매우 중요하다고 생각합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top