it-swarm.com.de

Ordnen Sie die Ergebnisse der gespeicherten Prozedur der SSIS-Variablen zu

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, this Gespeicherte Prozedur zu verwenden:

(enter image description here

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:

(enter image description here

Und hier ist die Bildschirmabdeckung des Precedence Constraint Editor:

(enter image description here

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

(enter image description here

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.

9
Ravi

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

OUTPUT-Parameter

Ihre gespeicherte Prozedur hat einen Parameter von @OrderCount Mit einer Richtung von OUTPUT

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 Schritte auszuführen, ohne OUTPUT anzugeben, 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.

(Specify OUTPUT clause and parameter place holder

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 mit dem Namen orderCount zugeordnet

(enter image description here

Einzelergebnissatz

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

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

(enter image description here

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

(enter image description here

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 Data Source Auf einen realen Server und Provider, um sie an Ihre SSIS-Version anzupassen. 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

(enter image description here

10
billinkc