У вас есть два варианта сделать эту работу. Либо вы можете использовать один набор результатов, либо вы можете использовать параметр OUTPUT. Вы в настоящее время используете ни правильно.
Выходной параметр
Ваша хранимая процедура определяется как имеющая параметр @OrderCount
с направлениемOUTPUT
Если вы хотите использовать хранимую процедуру в инструменте, SSMS, .NET, что угодно, это будет выглядеть примерно так
DECLARE @orderCount int = 0;
EXECUTE dbo.TestStoredProcSSVariable @orderCount OUTPUT;
SELECT @orderCount As OrderCountVariable;
Это верно для запуска вышеупомянутого без указания, OUTPUT
но посмотрите на значение @orderCount. Изменяется с 1435 до 0.
То же самое верно, когда вы используете задачу «Выполнение SQL» в службах SSIS. Необходимо указать, что параметр находится в OUTPUT, а также указать его на вкладке «Сопоставления параметров».
Также укажите переменную, которую вы хотите отобразить, и используйте там направление OUTPUT. Здесь я отобразил результат в переменную SSIS типа Int32 с именемorderCount
Единый набор результатов
У вас есть первая часть этого правильного - вы указали, что набор результатов является одной строкой.
Вы заметите, что я использую, EXECUTE dbo.TestStoredProcSSVariable ?
поскольку вы должны указать входное значение, иначе вызов proc прервется (по крайней мере, так, как вы его определили). Вы могли бы жестко закодировать значение вместо ?
подобного0
Затем на вкладке «Набор результатов» я сопоставляю первый столбец (нулевой порядковый номер) с переменной orderCountb
Если вы запустите предоставленную хранимую процедуру, вы не получите значение в orderCountb. Почему? Потому что вы ничего не возвращаете из вызова хранимой процедуры. Я добавил заключительное утверждение внутри хранимой процедуры
SELECT @OrderCount AS OrderCount;
Сделай сам
Вы можете исследовать любой подход, используя следующий biml. Что такое BIML? Язык разметки Business Intelligence является операционной системой для BI. Почему вы заботитесь об этом, так это о том, что он позволит вам преобразовать некоторый XML в пакет служб SSIS. Все, что вам нужно сделать, это загрузить и установить бесплатный аддон BIDS Helper
После установки BIDS Helper,
- Щелкните правой кнопкой мыши по проекту и выберите «Добавить новый файл Biml».
- замените содержимое файла следующим XML
- Исправьте значения в строке 5. Обновите
Data Source
сервер Provider
до реального сервера и приведите в соответствие с вашей версией SSIS. Глядя на ваш скриншот, скорее всего, это будет SQLNCLI10.1
- Щелкните правой кнопкой мыши на BimlScript.biml и выберите «Создать пакеты служб 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>
Наслаждайтесь следующим пакетом служб SSIS
@[User::orderCount]