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 @OrderCount
mit 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 OUTPUT
Schritte 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 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
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
Dann ordne ich hier auf der Registerkarte Ergebnismenge die erste Spalte (nullte Ordnungszahl) einer Variablen mit dem Namen zu orderCountb
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
- Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Neue Biml-Datei hinzufügen
- Ersetzen Sie den Inhalt der Datei durch das folgende XML
- Korrigieren Sie die Werte in Zeile 5. Aktualisieren Sie die
Data Source
auf einen realen Server und Provider
richten Sie sie an Ihrer SSIS-Version aus. Wenn Sie sich Ihren Screenshot ansehen, ist dies wahrscheinlich SQLNCLI10.1
- 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] < 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] < 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
@[User::orderCount]