2011-12-20 7 views
0

나는 다음 sql 작업을 자동화 된 ssis 패키지로 변환하려고 애를 썼다. for 루프를 사용하여 구현 시도 했어 conntainer하지만 루핑 논리를 만드는 동안 나는 막혔어요. 난 정말커서 로직 커서

여기에 T-SQL 코드 어쩌면

-- SCRIPT TO BULK IMPORT MATERNAL HLA & INSERT CORD NIMA 


IF OBJECT_ID('tempdb..#maternal_hla_from_solar') IS NOT NULL 
BEGIN 
     drop table #maternal_hla_from_solar 
END 

CREATE TABLE #maternal_hla_from_solar(
     [donor_id] [int] NOT NULL, 
     [antigen_id] [int] NOT NULL 
) 

-- bulk upload maternal HLA from file 
BULK 
INSERT #maternal_hla_from_solar 
FROM 'C:\Users\zabeenp\Documents\SQL\populate_db\data\20111212_maternal_hla.txt' 
WITH 
(
FIRSTROW = 2, 
MAXERRORS = 0, 
FIELDTERMINATOR = '\t', 
ROWTERMINATOR = '\n' 
) 

-- declare variables 
DECLARE @donor_id int 
DECLARE @maternal_hla varchar(5000) 
DECLARE @definitive_type_date date = GETDATE() 
DECLARE @modified_on datetime2(7) = GETDATE() 

-- Cursor to process each row from #maternal_hla_from_solar 
DECLARE c_insertCordNima CURSOR FAST_FORWARD 
FOR select DISTINCT donor_id from #maternal_hla_from_solar -- important to use DISTINCT here 
OPEN c_insertCordNima 
FETCH NEXT FROM c_insertCordNima INTO @donor_id 
WHILE @@FETCH_STATUS = 0 
BEGIN 
     SET @maternal_hla = '' -- important to wipe string each time 

     -- concatenare maternal antigen_ids into one string 
     SELECT @maternal_hla = COALESCE(@maternal_hla + ',', '') + CONVERT(VARCHAR(10),antigen_id) 
     FROM #maternal_hla_from_solar 
     where donor_id = @donor_id 

     -- remove first comma 
     SET @maternal_hla = (select right(@maternal_hla,len(@maternal_hla)-1)) 

     -- exec insertCordNIMA SP 
     EXECUTE insertCordNIMA 
     @donor_id 
     ,@maternal_hla 
     ,@definitive_type_date 
     ,@modified_on 

     FETCH NEXT FROM c_insertCordNima INTO @donor_id 
END 
CLOSE c_insertCordNima 
DEALLOCATE c_insertCordNima 
+0

귀하의 질문이 개선 될 것입니다 무슨 코드 그것의 * 목적 *. 탭으로 구분 된 파일을 임시 테이블로 읽은 다음 각 제공자 ID에 대해 쉼표로 구분 된 문자열을 작성한 다음 저장된 proc을 실행하는 것 같습니다. – billinkc

+0

코드의 목적은 마지막 donor_id까지 agin과 agin 위에 언급 된 매개 변수를 사용하여 저장 프로 시저를 실행하는 것입니다. 여기서는 기본적으로 동일한 donor_id를 가진 많은 antigen_ids가 있습니다. 따라서 위의 논리와 함께 각 단계에서 SP에주기 전에 스팅 킹해야합니다. . 내 ssis 패키지에서 초기 식을 가져 와서 식을 확인하고 for 루프에 대한 식을 늘릴 수 없다면 ssis의 for_loop에 대해 @@ FETCH_STATUS = 0을 대체 할 수있는 아이디어를 알려 주시기 바랍니다. – Tilak

+0

왜 커서를 교체해야합니까? 정확하고 신속하게 작동한다면 변경없이 SQL 실행 작업에 넣을 수 있습니다. SSIS의 루프 컨테이너는 일반적으로 가져 오기 또는 유사한 목적으로 여러 파일을 반복하는 데 사용됩니다. – Pondlife

답변