Zuweisen von Ergebnissen gespeicherter Prozeduren zu SSIS-Variablen

9

Ich versuche, den Wert einer gespeicherten Prozedur in eine SSIS-Variable zu übertragen, und teste dann, ob zwei SSIS-Aufgaben funktionieren können, wenn ich einen Ausdruck hinzufüge. Als Beispiel versuche ich, diese gespeicherte Prozedur zu verwenden:

Geben Sie hier die Bildbeschreibung ein

Vielleicht richte ich die Eigenschaften der SSIS-Variablen sogar völlig falsch ein, weil ich auch nicht sicher bin, ob ich dies richtig mache, damit der gespeicherte Prozesswert in eine SSIS-Variable importiert wird. Bitte sagen Sie mir, wenn Sie weitere Screencaps von etwas anderem benötigen.

Hier ist das Aufgabenbeispiel:

Geben Sie hier die Bildbeschreibung ein

Und hier ist die Bildschirmabdeckung des Precedence Constraint Editor:

Geben Sie hier die Bildbeschreibung ein

Und hier sind die Eigenschaften für die erste Aufgabe:

Geben Sie hier die Bildbeschreibung ein

Ich möchte, dass es basierend auf dieser Bedingung vorwärts geht (oder fehlschlägt). Aber wenn ich es teste, fließt der Prozess unabhängig von der ersten Aufgabe zur zweiten und zeigt mir nur "100% abgeschlossen" für die erste Aufgabe und nichts darüber, ob dieser Ausdruck auf wahr überprüft wurde oder nicht. Wie kann ich so etwas machen und was läuft falsch? Ich habe eine Variable in SSIS namens 'orderCount', um den Wert aus dem gespeicherten Prozess abzurufen.

Ravi
quelle
1
In Ihrer ersten SQL-Task @[User::orderCount]
ausführen
Würde es irgendwo in dieses Fenster gehen? (letztes Bild, das ich gerade als Beitragsbearbeitung hinzugefügt habe)
Ravi
1
Entschuldigung, auf der Result SetSeite. simple-talk.com/sql/ssis/…
Mark Sinkinson
Vielen Dank, das hat es geschafft! Es besteht die erste Aufgabe und fährt mit der zweiten fort. Ich möchte, dass es nicht weitergeht, weil der Ausdruck, den ich festgelegt habe, versucht zu sagen: "Wenn der an diese Variable übergebene Wert kleiner als 5 ist, führen Sie die nächste Aufgabe nicht aus."
Ravi
@ Jaywant Versuchen Sie bei der zweiten Aufgabe, einen Ausdruck für die Eigenschaft "Deaktivieren" festzulegen @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. Vergessen Sie nicht, die Ergebnisse in diesem Thread zu veröffentlichen, wenn dies erfolgreich ist. GL!
Peter Vandivier

Antworten:

10

Sie haben zwei Möglichkeiten, damit dies funktioniert. Sie können entweder eine einzelne Ergebnismenge oder den Parameter OUTPUT verwenden. Sie verwenden derzeit keine richtig.

OUTPUT-Parameter

Ihre gespeicherte Prozedur hat einen Parameter @OrderCountmit der RichtungOUTPUT

Wenn Sie die gespeicherte Prozedur in einem Tool, SSMS, .NET usw. verwenden möchten, sieht sie ungefähr so ​​aus

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

Es ist gültig, die obigen OUTPUTSchritte ohne Angabe auszuführen, aber den Wert von @orderCount zu überprüfen. Es ändert sich von 1435 auf 0.

Gleiches gilt, wenn Sie die Execute SQL Task in SSIS verwenden. Sie müssen angeben, dass sich der Parameter in OUTPUT befindet, und ihn auch auf der Registerkarte Parameterzuordnungen angeben.

Geben Sie die OUTPUT-Klausel und den Platzhalter für die Parameter an

Geben Sie auch die Variable an, die Sie zuordnen möchten, und verwenden Sie dort die OUTPUT-Richtung. Hier habe ich das Ergebnis einer SSIS-Variablen vom Typ Int32 zugeordnet, die aufgerufen wirdorderCount

Geben Sie hier die Bildbeschreibung ein

Einzelergebnissatz

Sie haben den ersten Teil davon richtig - Sie haben angegeben, dass die Ergebnismenge eine einzelne Zeile ist.

Sie werden feststellen, dass ich verwende, EXECUTE dbo.TestStoredProcSSVariable ?da Sie einen Eingabewert angeben müssen, sonst wird der Proc-Aufruf unterbrochen (zumindest so, wie Sie ihn definiert haben). Sie hätten einen Wert anstelle von ?ähnlichem hart codieren können0

Geben Sie hier die Bildbeschreibung ein

Dann ordne ich hier auf der Registerkarte Ergebnismenge die erste Spalte (nullte Ordnungszahl) einer Variablen mit dem Namen zu orderCountb

Geben Sie hier die Bildbeschreibung ein

Wenn Sie die bereitgestellte gespeicherte Prozedur ausführen, erhalten Sie in orderCountb keinen Wert. Warum? Weil Sie nichts vom Aufruf der gespeicherten Prozedur zurückgeben. Ich habe eine abschließende Anweisung in die gespeicherte Prozedur von eingefügt

SELECT @OrderCount AS OrderCount;

Mach es selbst

Sie können beide Ansätze mit dem folgenden Biml untersuchen. Was ist biml? Die Business Intelligence Markup Language ist das Betriebssystem für BI. Sie interessieren sich dafür, dass Sie damit XML in ein SSIS-Paket umwandeln können. Sie müssen lediglich das kostenlose Addon BIDS Helper herunterladen und installieren

Nach der Installation von BIDS Helper

  1. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Neue Biml-Datei hinzufügen
  2. Ersetzen Sie den Inhalt der Datei durch das folgende XML
  3. Korrigieren Sie die Werte in Zeile 5. Aktualisieren Sie die Data Sourceauf einen realen Server und Providerrichten Sie sie an Ihrer SSIS-Version aus. Wenn Sie sich Ihren Screenshot ansehen, ist dies wahrscheinlich SQLNCLI10.1
  4. Klicken Sie mit der rechten Maustaste auf BimlScript.biml und wählen Sie SSIS-Pakete generieren

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>

Genießen Sie das folgende SSIS-Paket

Geben Sie hier die Bildbeschreibung ein

billinkc
quelle
Das war unglaublich hilfreich und informativ, vielen Dank, billinkc! Sehr hilfreicher Beitrag! Vielen Dank!
Ravi