2013-08-23 2 views
0

비슷한 상황이 생겨서 올바른 방향으로 나를 가리킬 수 있는지 궁금합니다. 누군가 NULL 값을 'NULL'이라는 단어가 들어있는 텍스트 문자열로 바꿔 놓음에 따라 실망 스럽습니다. 제거해야하는 단어입니다.SSIS 여러 Unknow 열 업데이트

필자는 250 개 이상의 열과 각각 100 만 개가 넘는 6 개의 상당히 큰 테이블을 가지고 있으며 NULL이라는 단어가있는 행을 업데이트하고 적절한 NULL 값으로 바꾸는 것이 필요합니다. 이것이 어떤 열에 나타나는지 나는 모른다.

처음에는 모든 열을 값의 개수와 예상보다 적은 수로 표시하는 코드가 있는데, 열이 포함되어 있는지 확인하기 위해 SQL 쿼리를 실행합니다. 문자열 'NULL'및 다음 코드를 사용하여 NULL로 바꿉니다. 내가 SSIS로하려고하고있어 각 열을 반복하는 것입니다

declare @tablename sysname 
declare @ColName nvarchar(500) 
declare @sql nvarchar(1000) 
declare @sqlUpdate nvarchar(1000) 
declare @ParmDefinition nvarchar(1000) 

set @tablename = N'Table_Name' 
Set @ColName = N'Column_Name' 
set @ParmDefinition = N'@ColName nvarchar OUTPUT'; 

set @sql= 'Select ' + @ColName + ', Count(' + @ColName + ') from ' + @tablename + ' group by ' + @ColName + '' 
Set @sqlUpdate = 'Update ' + @tablename + ' SET ' + @ColName + ' = NULL WHERE '+ @ColName + ' = ''NULL''' 

print @sql 
print @sqlUpdate 

EXECUTE sp_executesql @sql, @ParmDefinition, @[email protected] OUTPUT; 
EXECUTE sp_executesql @sqlUpdate, @ParmDefinition, @[email protected] OUTPUT; 

Select Column_Name from Table_Name where Column_Name = 'NULL' 

해당 쿼리를 실행하고 업데이트를 수행합니다.

지금까지 나는 Information.Schema에서 열 이름을 추출하고 해당 테이블의 레코드 개수를 얻을 수 있지만 (sqlUpdate, 위와 같이) 실제 UPDATE 문 을 실행에 관해서 수 있습니다 - '가 아무튼 쿼리의 동적 표현에 만족하는 구성 요소 인 것 같습니다.

는 어디서 기록 (잘못 될 수 있음)이있는 경우 이동하는 결정하기 위해 조건부 분할을 사용하고 있는데 나는 업데이트 OLE DB 명령을 시도했습니다.

요약하면 SSIS가이 작업에 가장 적합한 도구인지 또는 내가 잘못된 장소를 찾고 있는지 궁금합니다.

SSIS 2005를 사용하고 있는데, 아직 잘 모르지만 제한이있을 수 있습니다.

모든 안내를 받으실 수 있습니다.

감사합니다,

답변

3

원리는 기본적으로 소리이지만, 아마 커서, 나는 SSIS을 떠날 것이다, 그리고 그것은 SQL 서버에 대해 직접 SSMS와는 거기 루프 논리를 구축 할 수 있습니다.

잠재적 인 값의 수를 먼저 확인해야하는지 확신 할 수 없습니다. 업데이트를 적용하고 때때로 행을 업데이트하지 않을 수도 있음을 인정하면 필터링이 중복되지 않습니다. 또한, 하나 개의 히트 테이블에 모든 업데이트를 적용하는 필터를 제거하고 잘못된 데이터의 밀도에 따라 nullif 사용을 고려할 수

declare columns cursor local read_only for 
select 
    c.TABLE_CATALOG, 
    c.TABLE_SCHEMA, 
    c.TABLE_NAME, 
    c.COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS c 
    inner join INFORMATION_SCHEMA.TABLES t 
     on c.TABLE_CATALOG = t.TABLE_CATALOG 
     and c.TABLE_SCHEMA = t.TABLE_SCHEMA 
     and c.TABLE_NAME = c.TABLE_NAME 
where c.DATA_TYPE like '%varchar%' 

open columns  
declare @catalog varchar(100), @schema varchar(100), @table varchar(100), @column varchar(100) 

fetch from columns into @catalog, @schema, @table, @column 

while @@FETCH_STATUS= 0 
begin 
    -- construct update here and execute it.  
    select @catalog, @schema, @table, @column 
    fetch next from columns into @catalog, @schema, @table, @column 
end 

close columns 
deallocate columns 

같은

뭔가.

는 예 :

update table 
set 
    col1 = nullif(col1, 'null'), 
    col2 = nullif(col2, 'null'), 
    ... 
+0

그래, 일반적으로 업데이트가 어쨌든 전체 스캔을 수행 할 것이기 때문에 카운트를 확인하면 테이블 및/또는 인덱스 스캔의 양이 두 배가됩니다 ... –

1

SSIS는 당신을위한 최선의 선택이 될 수 없습니다. 개념적으로 업데이트를 수행하고 있으며 많은 업데이트가 있습니다. SSIS는 빠른 삽입을 할 수 있습니다. 행 기반을 고민함으로써 업데이트가 발사됩니다.

SQL 기반 접근법에서는 모든 것을 수정하기 위해 1000 개의 업데이트 문을 실행해야합니다. SSIS 기반 시나리오에서 OLE DB 명령과 함께 데이터 흐름을 사용하면 1000 * 1000000이 표시됩니다.

커서를 직접 건너 뛸 수 있습니다. 그것은 커서를 사용할 수있는 시간이지만 테이블이 'NULL'로 소리가 날 때처럼 흩어져있는 경우 모든 행을 업데이트하고 동일한 레코드로 돌아 가지 않고 주어진 레코드의 모든 필드를 수정한다고 가정합니다. 각각의 것은 고정 될 필요가있다.

+0

커서 목록을 작성하는 것만 제안했습니다. 테이블/열, 업데이트 자체를하지 않습니다. – podiluska

+0

SSIS가 작동하지 않는다는 느낌이 들었지 만, 나 자신에게 증명해야하고 과정에서 유용한 가이드를 찾았습니다. 위의 코드 단편에 나와있는 것처럼 행을 업데이트하기에 충분하므로 SSMS에서 열을 반복하는 방법을 찾을 것입니다. 나는 컬럼을 찾은 유사한 커서 문을 가지고 있는데, 이것을 SSIS 컬럼 기준의 기초로 사용 했으므로 다른 해결책으로 시도해 보겠습니다. – JonTout