2010-05-19 2 views
0

불행히도 문제는 재현 할 수 없지만 누군가에게 익숙한 경우를 대비하여 설명하려고합니다. SSIS 2005, SP2를 사용하고 있습니다.SSIS - 파생 된 열 변환에 사용되는 사용자 변수를 사용할 수 없음 - 경우에 따라

내 패키지는 패키지 범위 사용자 변수가 있습니다 -의는 제어 흐름에서

  1. 첫 번째 단계는 저장 프로 시저를 실행하는 SQL 실행 작업입니다 user_var를 호출 할 수 있습니다. SP가 수행하는 작업은 SQL 테이블 (ID 열 포함)에 레코드를 삽입 한 다음 돌아가서 최대 ID 값을 얻는 것입니다. SQL 실행 작업이 user_var
  2. 에이 출력을 저장하는 제어 흐름 다음 데이터 흐름 작업을 가지고 - 그것은가는 어떤 소스 데이터를 가져, 라는 열을 설정하는 파생 열이 run_id user_var에 - 그리고 데이터를 SQL 대상에 저장

대부분의 경우 (이 템플릿은 매일 많은 패키지에 사용됨)이 모든 것이 효과적입니다. 생성 된 모든 대상 레코드는 올바른 run_id으로 설정됩니다.

그러나, 어떤 경우에는, run_id 동일 user_var을하지 않는 대상 데이터 세트가, 대신에 0의 값을 (0 user_var의 기본값입니다) 가져옵니다.

나는이 일이 일어난 2 가지 경우가 있지만, 나는 할 수 없다. 일이 일어난다. 두 경우 모두 run_id = 0 인 레코드가 10,000 개에 불과했습니다. SSIS가 10,000 개의 레코드 블록에 데이터를 기록하기 때문에 처음에 기록 된 데이터의 경우 user_var이 아직 설정되지 않았습니다. . 그런 다음 첫 번째 블록 이후 나머지 데이터에 대해 run_id이 올바른 값으로 설정됩니다.

그러나 컨트롤이 SQL 실행 작업에서 내 데이터 흐름으로 전달되었습니다. SP가 완료되고 user_var이 설정 될 때까지 계속 진행되지 않을 것이라고 생각됩니다. 어쩌면 SP를 실행하지만 완료 될 때까지 기다리지 않을 수 있습니까?

두 경우 모두 거의 같은 시간에 새로운 user_var을 얻기 위해 테이블을 때리는 패키지가 몇 개있는 것으로 보입니다. 그리고 두 경우 모두 많은 데이터 (4 천만 행, 6 천만 행)가 기록되었습니다. 제 생각에 그것은 글이 잠시 동안 일어 났음을 의미합니다.

장황하고 모호한 일입니다. 성공적인 조합! 누구에게도 익숙한 소리입니까? 감사.

CREATE PROCEDURE [dbo].[sp_GetRunIDForPackage] (@pkg varchar(50)) AS 

-- add a new entry for this run of this package - the RUN_ID is an IDENTITY column and so 
-- will get created for us 
    INSERT INTO shared.STAGE_LOAD_JOB(EFFECTIVE_TS, EXECUTED_BY) 
    VALUES(getdate(), @pkg) 

-- now go back into the table and get the new RUN_ID for this package 
SELECT MAX(RUN_ID) 
    FROM shared.STAGE_LOAD_JOB 
    WHERE EXECUTED_BY = @pkg 

답변

0

당신이 파생 열 구성 요소에 도착하기 전에 user_var의 값을 확인 했 :

나는 user_var를 얻기 위해 사용하는 SP를 보여 업데이트? user_var이 0 일 수 있으므로 run_id = user_var; run_id = 0. 나는 그것이 간단하다고 생각하는 것이 순진 할 지 모르지만 그것이 내가 확인할 것임이 처음이다.

+0

문제가되는 DFT가 나오기 전에 실제로는 ** user_var **를 사용하는 또 다른 (감사하는) DFT가 있습니다. ** user_var **에서 항상 0이 아닌 값을 쓰는 데 성공합니다. 이것은 ** user_var **에 0이 아닌 값이 있다고 믿게합니다. 차이점은 주 (문제가있는) DFT가 많은 양의 데이터를 작성하고 감사 DFT가 빠르기 때문일 수 있습니다. 그러나 감사 DFT가 먼저옵니다! 그래서 이상한. – soo

0

프로 시저 코드는,이 대체 할 수 있습니다 감안할 때이와 WHERE EXECUTED_BY = @pkg

shared.STAGE_LOAD_JOB 로부터 을

SELECT MAX (RUN_ID를)

선택 SCOPE_IDENTITY을()

scope_identity() 함수는 현재 범위에 입력 된 ID를 반환합니다. 전자 절차. 이것이 문제를 해결할 지 확신 할 수는 없지만 관련이없는 결과가있을 수 있으므로 문제를 해결하는 것이 가장 좋습니다.

+0

은 SP에 대한 코드를 원래 게시물 – soo

+0

에 추가했기 때문에 scope_identity를 사용하여 생각했습니다. 내 직감이지만 user_var *가 잘 설정되어 있지만 Ben의 경험과 비슷한 값을 가질 수없는 경우가 있습니다. 확실히 입력을 감사드립니다. – soo

3

이 변수는 많은 장소에서 여러 번 액세스합니까? 동일한 변수를 사용하여 많은 양의 병렬 데이터 흐름이 있습니까?

SQL 2005와 2008에서 버그가 발생하여 "경쟁 조건"으로 인해 변수가 일부 스레드에서 액세스 할 수 없게되고 기본값이 사용됩니다. 우리의 경우 변수는 패키지의 "기본 폴더"위치 였기 때문에 전체 실행 제어 패키지가 하위 패키지를 찾지 못했습니다. 여기

더 많은 세부 사항 : SSIS Intermittent variable error: The system cannot find the file specified

불행하게도, 주위 작업은 하드 코드에 경쟁 조건이 발생했을 때 작동 변수에 디폴트 값입니다. 우리를 위해 쉽게 (기본 환경을 설정하기 위해 기본 폴더를 설정하십시오.)하지만 문제가 많이 발생합니다.

아마도 여러 변수 (각 데이터 흐름마다 하나씩)와 SQL 실행 작업을 사용하여 해당 변수를 채울 수 있습니까? 정말 못 생겼지 만 도움이 될 것입니다.

+0

나는 조건을 믿을 수 없을만큼 간헐적으로 재현하기가 어려웠지만 정기적으로 다른 패키지에서 다른시기에 추가해야한다고 덧붙였다. Microsoft 기술 지원부에 2GB의 전체 스택 추적을 제공했습니다. –

+0

안녕하세요 벤, 고마워요 .- var에 접근하는 병렬 데이터 흐름이 없기 때문에 약간의 차이가 있어야하지만 이것은 매우 유사한 효과를냅니다. 변수에 액세스하는 DFT가 여러 개 있지만 순서는 같습니다. 유용한 힌트처럼 들리지만 ... var 및 *를 * 읽기 전용으로 설정하는 방법이 있다고 가정하지 않습니까? 있다면, 당신의 상황에 좋은 해결책이었을 것이라는 것은 의심의 여지가 없습니다. – soo

+0

Readonly/ReadWrite는 변수 속성이 아니라 액세스 방법입니다. 한 프로세스가 변수에 readwrite로 액세스하도록 할 수 있지만 다른 프로세스는 읽기 전용으로 액세스 할 수 있습니다. 이를 방지하기 위해 각 DFT를 서로의 발가락을 밟지 않도록 자체 변수로 유지합니다. DFT에 여러 경로가 있고 각 결과가 변수를 다른 값으로 설정하는 경우 고려해야 할 사항이 있습니다. 내가 찾은 것은 마지막 경로를 예측할 수 없기 때문에 값을 덮어 쓸 수 있다는 것입니다. 나는 그것에 관해 블로깅했다. http://josef-richberg.squarespace.com/journal/2010/5/1/ssis-data-flow-paths.html –

관련 문제