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 @OrderCount
z 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, OUTPUT
ale 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.
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
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
Następnie, na zakładce Zestaw wyników, tutaj mapuję pierwszą kolumnę (zero porządkowa) na zmienną o nazwie orderCountb
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,
- Kliknij projekt prawym przyciskiem myszy i wybierz Dodaj nowy plik Biml
- zastąp zawartość pliku następującym kodem XML
- Napraw wartości w wierszu 5. Zaktualizuj
Data Source
serwer Provider
do prawdziwego i wyrównaj z wersją SSIS. Patrząc na zrzut ekranu, prawdopodobnie będzie to SQLNCLI10.1
- 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] < 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>
Korzystaj z następującego pakietu SSIS
@[User::orderCount]