2010-05-11 3 views
3

일부 데이터를 통합하기 위해 동적으로 작성된 큰 뚱뚱한 쿼리가 있습니다. 기본적으로 테이블을 쿼리하고, 다른 테이블을 조인하고, 일부 데이터를 처리 한 다음 최종 테이블에 삽입합니다.어떤 행에서 오류가 발생했는지 확인하십시오.

문제는 너무 많은 데이터가 있고 오류가 있거나 일치하지 않는 데이터가있을 수 있으므로 원본을 신뢰할 수 없다는 것입니다.

예를 들어, 고객의 데이터베이스를 사용하여 개발하는 동안 오류를 찾는 데 많은 시간을 보냈습니다. 내 큰 뚱뚱한 쿼리 중간에 일부 varchar를 datetime으로 변환하는 중 오류가 발생했기 때문입니다. 범위를 벗어난 날짜 인 '2009-02-29'로 판매되는 판매가 있었다는 것이 밝혀졌습니다. 예, 알고 있습니다. 왜 그것이 varchar로 저장 되었습니까? 음, 소스 데이터베이스에는 날짜, '월', '일'및 '연도'에 대한 3 개의 열이 있습니다. 왜 그런지 모르지만 여전히 그렇습니다.

하지만 원본을 신뢰할 수 없다면 어떻게 처리할까요?

나는 예외를 처리 할 수 ​​없다. 원래 메시지와 다른 레벨까지 올 필요가 있지만 좀 더 많은 정보를 제공하여 사용자가 적어도 우리에게 전화하기 전에 해결할 수 있도록해야한다.

그래서 사용자에게 행 번호 또는 적어도 수정해야 할 레코드가 무엇인지에 대한 아이디어를 줄 수있는 ID를 표시하는 방법에 대해 생각했습니다. 통합이 최대 80000 건까지 실행되는시기가 있기 때문에 또한 어려운 일입니다. 그리고 80000 레코드 통합에서 단일 더미 오류 메시지 : 'varchar 데이터 형식을 datetime 데이터 형식으로 변환하면 범위를 벗어나는 datetime 값이 발생 함'은 전혀 의미가 없습니다.

어떤 아이디어라도 감사 할 것입니다.

오 나는 서비스 팩 SQL 서버 2005을 사용하고 있습니다 3.


편집 :이 답변으로 읽은 것을 위해, 할 수있는 가장 좋은 검사가 그래서,

확인 각 열은 오류를 제기하는 데 중요한 역할을 할 수 있으며, 조건에 참석하는 경우 직접 설명해야하는 오류 메시지를 표시하고 별도의 테이블이나 변수에 저장할 수있는 정보를 추가해야합니다. 예 : 행 ID 또는 다른 루트 정보. 날짜

답변

1

이 표준 ETL 문제처럼 들리는 곳 그럼 그냥 스테이징 테이블에서 삽입과 같은 UPDATE 명령을 실행 하중. (동일한 데이터 집합에 대해 반복적으로이 쿼리를 실행해야하는 경우가 아니면 반복해서 동일한 작업을 수행해야합니다.) 따라서 성능이 얼마나 중요한가?

종류의 오류 처리 및/또는 "불량 데이터보고"를 제공 할 수 있습니까? "하나의 커다란 뚱뚱한 질문"으로 모든 것이 있으면 옵션이 매우 제한적입니다. 쿼리가 작동하거나 그렇지 않으면 옵션이 작동하지 않을 수도 있습니다. 그렇다고 생각하지 않으면 발신자에게 RAISERROR 메시지를 보내야합니다. 뭐야. 이 같은 상황에서

, 내가 설정하려고하려는 일반적인 프레임 워크는 다음과 같습니다
  • 소스 테이블 (들)
  • 이 (SQLMenace의 스테이징 테이블) 테이블의 중간 세트를 생산 시작 당신은는
  • 그 테이블에 대해 "꽤 크고 뚱뚱 쿼리를"쓰기 consistant 제대로 형성 (유효한 데이터, 키 등) 알고 것을

이렇게하면 유효한 데이터 세트가 항상 비어 있더라도 반환하거나 저장할 수 있습니다. 트릭은 루틴이 실패 할 때를 결정하는 데 도움이됩니다. 데이터가 너무 손상되어 원하는 결과를 생성 할 수 없으므로 대신 적절하게 말한 오류 메시지를 반환합니다.

+0

오류 메시지로 내 프로그램에 문자열을 다시 제공 할 수 있습니다. 하지만 큰 쿼리에서이를 연결하여 오류가있는 레코드에 대한 정보를 제공 할 수 있습니다. 오, 그리고 당신이 지적했듯이, 쿼리가 작동하거나 그렇지 않습니다. 에러를 잡으려고하지 않습니다. 나는 그들을 지적하려고합니다. 그래서 내가 찾은 첫 번째 오류에 대한 실행을 중단하고 사용자에게 책임 기록을 보여줍니다. – Smur

2

내 검사를 수행 ISDATE 기능

select ISDATE('20090229'),ISDATE('20090227') 

나는 보통 스테이징 테이블에 삽입을 사용하고 실제 테이블

에 삽입 할 수있는
+0

댕 - 내 대답은 당신이 준비에 관해 말한 것과 거의 같지만, 당신은 더 간결하고 명확합니다. – MJB

+0

예, 데이터 준비, 데이터 정리, 프로덕션 테이블로 데이터로드. – HLGEM

2

내 제안에있을 것이다 사전 검증 들어오는 데이터 및 오류가 발생하면 레코드를 따로 보관하십시오. 예를 들어 유효하지 않은 날짜를 확인하십시오. 80K 세트에서 20 개가 있다고 가정 해보십시오. 레코드를 첨부 한 오류 메시지와 함께 별도의 테이블로 20을 당겨. 다른 유효성 검증을 실행 한 다음 나머지 (모든 유효한) 레코드를 원하는 목표 테이블로 가져 오십시오.

성능에 너무 많은 영향을 줄 수 있지만 오류를 쉽게 지적하고 오류를 수정 한 다음 두 번째 패스에 삽입 할 수 있습니다.

1

은 행을 찾으려면이 같은 시도 : 당신이 상태 열이 가장 열이 NULL을 VARCHAR하고 수 있도록 준비 테이블,에

...big fat query here... 
WHERE ISDATE(YourBadVarcharColumn)!=1 

로드 데이터를. ! 추출, 변환 및 :

UPDATE Staging 
    SET Status='X' 
    WHERE ISDATE(CONVERT(YourCharYear+YourCharMonth+YourCharDat+)!=1 
     OR OtherColumn<4... 

상태 = 'X'가

INSERT INTO RealTable 
     (col1, col2...) 
    SELECT 
     col1, col2, ... 
     where Status!='X' 
+0

그러면 상태 열을 기반으로 준비 테이블에서 불량 행을 쉽게보고 할 수 있습니다. –

관련 문제