2013-05-22 4 views
-4

데이터를 스크럽해야합니다. 플랫 파일에서 일부 열의 SQL Server 테이블로 데이터를로드했습니다. -111, -11, -11과 같은 일부 값이 있습니다. 즉, 음수 값으로 시작하고 일부 빈 공간이 있습니다. 이러한 값을 모두 어떻게 대체 할 수 있습니까? 내 데이터베이스의 모든 테이블에 NULL이 있습니까?SQL Server에서 데이터 스크럽

+1

stackoverflow에 오신 것을 환영합니다. 질문에 대한 답변을 제공하기 위해 코드 스 니펫, 테이블 구조, 예제 입력/출력, 오류 메시지 및 특정 질문과 관련된 모든 정보를보고 싶습니다. –

+1

SSIS를 사용하지 않는 이유는 무엇입니까? –

+0

SSIS에 대해 잘 모르는 경우 왜 태그로 포함 했습니까? –

답변

1

SQL Server 2012를 사용하는 경우 TRY_CONVERT 함수를 사용하여 캐스트 할 수있는 항목을 캐스팅하고 나머지는 NULL로 설정하십시오. 데이터를 정리하는 경우

TRY_CONVERT(DataType, FieldName) 

, 당신이 잘못된 값을 찾기 위해 CHARINDEX을 사용할 수 있습니다, 귀하의 예제에서 어디에 기준이 될 것, 또는 CASE 문은 CHARINDEX을 사용 : 당으로

Fieldname = CASE WHEN CHARINDEX('-',Fieldname) > 0 THEN NULL ELSE Fieldname END 

당신의 요청 : -의 모든 테이블의 모든 필드에서 NULL로 ''

DECLARE @Iterator varchar(55),@strSQL VARCHAR(8000) 
DECLARE xyz CURSOR 
FOR 
--Select stuff to iterate over 
SELECT DISTINCT t.name 
FROM sys.columns c INNER JOIN 
sys.tables t ON c.object_id = t.object_id INNER JOIN 
sys.schemas s ON t.schema_id = s.schema_id 

OPEN xyz 

FETCH NEXT FROM xyz 
INTO @Iterator 

WHILE @@FETCH_STATUS = 0 
BEGIN 

--Do stuff 
SET @strSQL = '   
     DECLARE @Iterator2 varchar(55), @strSQL2 varchar(8000) 
     DECLARE xyz2 CURSOR 
     FOR 
     --Select stuff to iterate over 
     SELECT DISTINCT c.name 
     FROM sys.columns c INNER JOIN 
      sys.tables t ON c.object_id = t.object_id INNER JOIN 
      sys.schemas s ON t.schema_id = s.schema_id 
     WHERE t.name = '''[email protected]+''' 

     OPEN xyz2 

     FETCH NEXT FROM xyz2 
     INTO @Iterator2 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 

     --Do stuff 
     SET @strSQL2 = '' 
     UPDATE '[email protected]+' 
     SET ''[email protected]+'' = NULL 
     WHERE CHARINDEX(''''-'''',''[email protected]+'') <> 0 
      '' 
     PRINT @strSQL2 
      FETCH NEXT FROM xyz2 
      INTO @Iterator2 

     END 

     CLOSE xyz2 
     DEALLOCATE xyz2 
     GO 
     '  
PRINT (@strSQL) 

FETCH NEXT FROM xyz 
INTO @Iterator 

END 

CLOSE xyz 
DEALLOCATE xyz 
GO 

이 코드는 말 그대로 모든을 업데이트 그대로 믿을 수 없을만큼 바보 활성 DB. 글쎄, 현재의 형태로는 스크립트를 작성하여 실행하고, 출력 한 코드를 실행하면 모든 업데이트 문을 갖게됩니다. '% tabletowreck %'와 같은 t.name 또는 '% badcolumn %'같은 곳의 c.name

두 가지 모두에 대해 기준을 추가 할 수 있습니다. 커서 'PRINT'이 코드는 실행하는 것이 안전합니다. 두 PRINT를 모두 EXEC로 변경하면 오류가 발생하지만 잠재적으로 매우 위험하다는 점에주의하십시오.

+0

문자 그대로 "모든 테이블에서이 값을 모두 NULL로 바꾸려면"중첩 된 커서로 수행 할 수 있지만 매우 나쁜 생각 인 것 같습니다. 그것은 여러 테이블에 걸쳐 특정 필드를 누른 다음 그들을 지정할 수 있고 모든 테이블을 통해 루프를 단일 커서를 사용하여, 나는 두 버전을 가지고 싶다면 전화를 써주세요 ... –

+0

답장을 보내 주셔서 감사합니다 당신은 코드를 게시하시기 바랍니다. 그래서 나는 그것을 시험 할 수있다. 실제로 어떤 것이 데이터베이스에 여러 개의 테이블 (약 50 개)이 있습니다. 데이터를로드하는 중에 음수 값이있는 경우 빈 공간이므로 전체 데이터베이스에서 null로 바꿔야합니다. –

관련 문제