저장 프로 시저 결과를 SSIS 변수에 적용


9

저장 프로 시저에서 SSIS 변수로 값을 가져 와서 표현식을 추가하면 두 개의 SSIS 작업이 작동하는지 테스트하려고합니다. 예를 들어, 저장 프로 시저 를 사용하려고 합니다.

여기에 이미지 설명을 입력하십시오

아마도 저장된 proc 값을 SSIS 변수로 가져 오는 올바른 방법인지 확실하지 않기 때문에 SSIS 변수 속성을 완전히 잘못 설정했을 수도 있습니다. 더 이상 다른 스크린 캡이 필요한 경우 알려주십시오.

작업 예는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

우선 제약 조건 편집기 화면 캡처는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

첫 번째 작업의 속성은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

해당 조건에 따라 앞으로 (또는 실패) 원합니다. 그러나 테스트 할 때 프로세스는 첫 번째 작업에서 두 ​​번째 작업으로 진행되며 첫 번째 작업의 "100 % 완료"만 표시 하며이 표현식이 true인지 여부에 대해서는 아무것도 표시하지 않습니다. 어떻게 그런 일을 할 수 있고 무엇이 잘못됩니까? SSIS에 'orderCount'라는 변수가있어 저장된 proc에서 값을 가져옵니다.


1
첫 번째 SQL 실행 작업에서 저장 프로 시저의 출력을 다시 다음에 할당해야합니다.@[User::orderCount]
Mark Sinkinson

그 창문 어딘가에 갈까요? (방금 포스트 편집으로 추가 한 마지막 이미지)
Ravi

1
Result Set페이지 에서 죄송합니다 . simple-talk.com/sql/ssis/…
Mark Sinkinson

정말 고마워요! 첫 번째 작업을 통과하고 두 번째 작업으로 진행합니다. "그 변수에 전달 된 값이 5보다 작 으면 다음 작업을 수행하지 마십시오"라고 말한 식 때문에 진행하지 않기를 원합니다.
라비

두 번째 작업에서 @Jaywant, "Disable"속성에 대한 식을 다음과 같이 설정하십시오 @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. 성공하면이 스레드에 결과를 다시 게시하는 것을 잊지 마십시오. GL!
피터 Vandivier

답변:


10

이 작업을 수행하기 위해 두 가지 선택이 있습니다. 어느 쪽이든 당신은 단일 결과 집합을 사용할 수 있습니다 또는 당신은 출력 매개 변수를 사용할 수 있습니다. 현재 올바르게 사용하고 있지 않습니다.

출력 매개 변수

저장된 절차의 파라미터를 갖는 것으로 정의되는 @OrderCount방향으로OUTPUT

도구, SSMS, .NET 등에서 스토어드 프로 시저를 사용하려면 다음과 같이 보일 것입니다.

DECLARE @orderCount int = 0;
EXECUTE dbo.TestStoredProcSSVariable @orderCount OUTPUT;
SELECT @orderCount As OrderCountVariable;

지정하지 않고 위를 실행하는 것이 유효 OUTPUT하지만 @orderCount의 값을보십시오. 1435에서 0으로 변경됩니다.

SSIS 내에서 SQL 실행 작업을 사용할 때도 마찬가지입니다. 매개 변수가 OUTPUT에 있도록 지정하고 매개 변수 맵핑 탭에서도 지정해야합니다.

OUTPUT 절 및 매개 변수 자리 표시 자 지정

또한 매핑하려는 변수를 지정하고 OUTPUT 방향을 사용하십시오. 여기에 결과를 Int32라는 SSIS 변수에 매핑했습니다.orderCount

여기에 이미지 설명을 입력하십시오

단일 결과 세트

이 올바른 첫 번째 부분이 있습니다-결과 집합이 단일 행임을 지정했습니다.

당신은 내가 사용하고 있습니다 것입니다 EXECUTE dbo.TestStoredProcSSVariable ?당신이 입력 값 또는 (당신이 그것을 정의한 최소한으로) 중단 할 시저 호출을 지정해야한다. 당신은 하드 대신에 값을 코딩 수도 ?같은0

여기에 이미지 설명을 입력하십시오

그런 다음 결과 집합 탭에서 첫 번째 열 (0 번째 서수)을 변수라는 변수에 매핑합니다. orderCountb

여기에 이미지 설명을 입력하십시오

제공된 저장 프로 시저를 실행하면 orderCountb의 값을 얻지 못합니다. 왜? 저장 프로 시저 호출에서 아무것도 반환하지 않기 때문입니다. 저장 프로 시저 안에 최종 진술을 추가했습니다.

SELECT @OrderCount AS OrderCount;

너 스스로해라

다음 biml을 사용하여 두 가지 방법 중 하나를 탐색 할 수 있습니다. Biml이란 무엇입니까? Business Intelligence Markup Language는 BI의 운영 체제입니다. 이것이 중요한 이유는 일부 XML을 SSIS 패키지로 변환 할 수 있기 때문입니다. 무료 애드온 BIDS 도우미를 다운로드하여 설치하기 만하면됩니다.

BIDS Helper를 설치 한 후

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 새 Biml 파일 추가를 선택하십시오.
  2. 파일 내용을 다음 XML로 바꿉니다.
  3. 5 행의 값을 수정하십시오. Data Source를 실제 서버로 업데이트하고 ProviderSSIS 버전에 맞 춥니 다. 스크린 샷을 보면 아마도 SQLNCLI10.1 일 것입니다.
  4. BimlScript.biml을 마우스 오른쪽 단추로 클릭하고 SSIS 패키지 생성을 선택하십시오.

Bimlscript.biml

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <Connection
            Name="tempdb"
            ConnectionString="Data Source=.\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;"
            />
    </Connections>
    <Packages>
        <Package
            Name="dba_114775"
            ConstraintMode="Linear"
        >
            <Tasks>
                <ExecuteSQL
                    ConnectionName="tempdb"
                    Name="SQL Make procedure">
                    <DirectInput>
                        <![CDATA[IF EXISTS
(
    SELECT
        *
    FROM
        sys.procedures AS P 
        INNER JOIN 
            sys.schemas AS S
            ON S.schema_id = P.schema_id
    WHERE
        S.name = 'dbo'
        AND P.name = 'TestStoredProcSSVariable'
)
BEGIN
    DROP PROCEDURE dbo.TestStoredProcSSVariable
END
GO
CREATE PROCEDURE dbo.TestStoredProcSSVariable
(
    @OrderCount int OUTPUT
)
AS
BEGIN
    SET NOCOUNT ON;

    SET @OrderCount = 1135;
    SELECT @OrderCount AS OrderCount;
END

GO

]]>
                    </DirectInput>

                </ExecuteSQL>
                <Container Name="SEQC Result set" ConstraintMode="Linear">
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SQL Make procedure.Output"></Input>
                        </Inputs>
                    </PrecedenceConstraints>
                    <Tasks>
                        <ExecuteSQL
                              ConnectionName="tempdb"
                              ResultSet="SingleRow"
                              Name="SQL SingleRow">
                            <DirectInput>EXECUTE dbo.TestStoredProcSSVariable ?;</DirectInput>
                            <Results>
                                <Result VariableName="User.orderCountb" Name="0" />
                            </Results>
                            <Parameters>
                                <Parameter DataType="Int32" VariableName="User.orderCountb" Name="0" />
                            </Parameters>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                            <DirectInput>SELECT 1;</DirectInput>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="Execute SQL Task 2">
                            <DirectInput>SELECT 1;</DirectInput>
                            <PrecedenceConstraints>
                                <Inputs>
                                    <Input 
                                        OutputPathName="SQL Placeholder.Output" 
                                        EvaluationOperation="ExpressionAndConstraint" 
                                        EvaluationValue="Success" 
                                        Expression="@[orderCount] &lt; 5" />
                                </Inputs>
                            </PrecedenceConstraints>
                        </ExecuteSQL>
                    </Tasks>
                </Container>
                <Container Name="SEQC Output Parameter" ConstraintMode="Linear">
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SQL Make procedure.Output"></Input>
                        </Inputs>
                    </PrecedenceConstraints>
                    <Tasks>
                        <ExecuteSQL
                              ConnectionName="tempdb"
                              Name="SQL Output parameter">
                            <DirectInput>EXECUTE dbo.TestStoredProcSSVariable ? OUTPUT;</DirectInput>
                            <Parameters>
                                <Parameter 
                                    DataType="Int32" 
                                    VariableName="User.orderCount" 
                                    Name="0" 
                                    Direction="Output" />
                            </Parameters>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                            <DirectInput>SELECT 1;</DirectInput>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="Execute SQL Task 2">
                            <DirectInput>SELECT 1;</DirectInput>
                            <PrecedenceConstraints>
                                <Inputs>
                                    <Input 
                                        OutputPathName="SQL Placeholder.Output" 
                                        EvaluationOperation="ExpressionAndConstraint" 
                                        EvaluationValue="Success" 
                                        Expression="@[orderCount] &lt; 5" />
                                </Inputs>
                            </PrecedenceConstraints>
                        </ExecuteSQL>

                    </Tasks>
                </Container>
                <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                    <DirectInput>SELECT 1;</DirectInput>
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SEQC Result set.Output" />
                            <Input OutputPathName="SEQC Output Parameter.Output" />
                        </Inputs>
                    </PrecedenceConstraints>
                </ExecuteSQL>
            </Tasks>
            <Variables>
                <Variable DataType="Int32" Name="orderCount">-1</Variable>
                <Variable DataType="Int32" Name="orderCountb">-1</Variable>
            </Variables>
        </Package>
    </Packages>
</Biml>

다음 SSIS 패키지를 즐기십시오

여기에 이미지 설명을 입력하십시오


그것은 대단히 도움이되고 유익했습니다. billinkc, 대단히 감사합니다! 매우 유용한 게시물! 고마워요!
Ravi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.