Przypisywanie wyników procedury składowanej do zmiennej SSIS

9

Próbuję przekształcić wartość z procedury składowanej w zmienną SSIS, a następnie testuję, czy dwa zadania SSIS mogą działać, jeśli dodam wyrażenie. Na przykład próbuję użyć tej procedury składowanej:

wprowadź opis zdjęcia tutaj

Może nawet źle konfiguruję właściwości zmiennej SSIS, ponieważ nie jestem również pewien, czy robię to we właściwy sposób, aby zaimportowana wartość proc została zaimportowana do zmiennej SSIS. Proszę, powiedz mi, jeśli potrzebujesz więcej zrzutów ekranowych czegokolwiek innego.

Oto przykład zadania:

wprowadź opis zdjęcia tutaj

A oto zrzut ekranu edytora ograniczeń Priorytetu:

wprowadź opis zdjęcia tutaj

A oto właściwości pierwszego zadania:

wprowadź opis zdjęcia tutaj

Chcę, aby postępował (lub nie powiódł się) w oparciu o ten warunek. Ale kiedy go testuję, proces przechodzi niezależnie od pierwszego zadania do drugiego i pokazuje mi tylko „100% ukończenia” dla pierwszego zadania i nic o tym, czy sprawdził, czy to wyrażenie jest prawdziwe, czy nie. Jak mogę to zrobić i co się dzieje? Mam zmienną w SSIS o nazwie „orderCount”, aby uzyskać wartość z przechowywanego proc.

Ravi
źródło
1
W pierwszym zadaniu Wykonaj SQL musisz przypisać dane wyjściowe procedury @[User::orderCount]
składowanej z
Czy pójdzie gdzieś w tym oknie? (ostatnie zdjęcie, które właśnie dodałem jako post edit)
Ravi
1
Przepraszam na Result Setstronie. simple-talk.com/sql/ssis/…
Mark Sinkinson
Wielkie dzięki, że to zrobiło! Przechodzi pierwsze zadanie i przechodzi do drugiego. Chcę, żeby nie poszło do przodu z powodu wyrażenia, które ustawiłem, próbując powiedzieć „Jeśli wartość przekazana do tej zmiennej jest mniejsza niż 5, nie wykonuj następnego zadania”.
Ravi
@Jaywant w drugim zadaniu, spróbuj ustawić wyrażenie dla właściwości „Wyłącz” coś w rodzaju @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. Nie zapomnij opublikować wyników z powrotem w tym wątku, jeśli się powiedzie. GL!
Peter Vandivier,

Odpowiedzi:

10

Masz dwie możliwości, aby to zadziałało. Możesz użyć pojedynczego zestawu wyników lub parametru WYJŚCIE. Obecnie nie używasz poprawnie.

Parametr WYJŚCIE

Procedura składowana jest zdefiniowana jako posiadająca parametr @OrderCountz kierunkiemOUTPUT

Gdybyś chciał skorzystać z procedury przechowywanej w narzędziu, SSMS, .NET, cokolwiek, wyglądałoby to mniej więcej tak

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

Prawidłowe jest uruchomienie powyższego bez określania, OUTPUTale spójrz na wartość @orderCount. Zmienia się z 1435 na 0.

To samo dotyczy sytuacji, gdy korzystasz z polecenia Wykonaj SQL w SSIS. Musisz określić, że parametr jest ustawiony na WYJŚCIE, a także określić go na karcie Odwzorowania parametrów.

Podaj klauzulę OUTPUT i parametr zastępczy parametru

Określ również zmienną, którą chcesz zmapować i użyj tam parametru WYJŚCIE. Tutaj zamapowałem wynik na Zmienną SSIS typu Int32 o nazwieorderCount

wprowadź opis zdjęcia tutaj

Zestaw jednego wyniku

Masz pierwszą część tej poprawki - określiłeś, że zestaw wyników to Pojedynczy wiersz.

Zauważysz, że używam, EXECUTE dbo.TestStoredProcSSVariable ?ponieważ musisz podać wartość wejściową, w przeciwnym razie wywołanie proc zostanie przerwane (przynajmniej tak, jak to zdefiniowałeś). Mógłbyś na stałe zakodować wartość zamiast ?podobnego0

wprowadź opis zdjęcia tutaj

Następnie, na zakładce Zestaw wyników, tutaj mapuję pierwszą kolumnę (zero porządkowa) na zmienną o nazwie orderCountb

wprowadź opis zdjęcia tutaj

Jeśli uruchomisz podaną procedurę składowaną, nie otrzymasz wartości w orderCountb. Dlaczego? Ponieważ nic nie zwracasz z wywołania procedury składowanej. Dodałem końcowe oświadczenie wewnątrz procedury przechowywanej

SELECT @OrderCount AS OrderCount;

Zrób to sam

Możesz zbadać dowolne podejście, używając następującego bimla. Co to jest biml? Business Intelligence Markup Language to system operacyjny dla BI. Dlatego zależy Ci na tym, że pozwoli ci to przekształcić trochę XML w pakiet SSIS. Wszystko, co musisz zrobić, to pobrać i zainstalować bezpłatny dodatek BIDS Helper

Po zainstalowaniu BIDS Helper,

  1. Kliknij projekt prawym przyciskiem myszy i wybierz Dodaj nowy plik Biml
  2. zastąp zawartość pliku następującym kodem XML
  3. Napraw wartości w wierszu 5. Zaktualizuj Data Sourceserwer Providerdo prawdziwego i wyrównaj z wersją SSIS. Patrząc na zrzut ekranu, prawdopodobnie będzie to SQLNCLI10.1
  4. Kliknij BimlScript.biml prawym przyciskiem myszy i wybierz Generuj pakiety 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>

Korzystaj z następującego pakietu SSIS

wprowadź opis zdjęcia tutaj

billinkc
źródło
To było niezwykle pomocne i pouczające, dziękuję bardzo, Billinkc! Niezwykle pomocny post! Wielkie dzięki!
Ravi