Хранимая процедура SQL Server 2008 с несколькими выходными параметрами - PullRequest
6 голосов
/ 09 августа 2011

У меня есть хранимая процедура следующим образом:

ALTER PROCEDURE [dbo].[sp_web_orders_insert]
(
    @userId int = default,
    @custId int = default,
    @orderDate datetime = default,
    @orderTotal money = default,
    @statusId int = default,
    @orderReference varchar(50) = default,
    @custReference varchar(50) = default,
    @order_ID INT output,
    @orderReferenceOutput varchar(50) output
)
AS


    SET NOCOUNT OFF;
    INSERT INTO [web_orders] ([user_ID], [cust_ID], [orderDate], [orderTotal], [statusId], [orderReference], [custReference]) VALUES (@userId, @custId, @orderDate, @orderTotal, @statusId , 'PLC' + REPLICATE('0', (7 - LEN((select MAX(order_ID) from web_orders)))) +  CAST((select(max(order_ID)+1) from web_orders) AS VARCHAR(5)), @custReference);

    SELECT @order_ID = @@IDENTITY
    RETURN @order_ID

    SELECT @orderReferenceOutput = 'PLC' + REPLICATE('0', (7 - LEN((select MAX(order_ID) from web_orders)))) +  CAST((select(max(order_ID)+1) from web_orders) AS VARCHAR(5))
    RETURN @orderReferenceOutput 

По какой-то причине второй выходной параметр @orderReferenceOutput ничего не возвращает.Цель этого второго выходного параметра - получить столбец, который я только что вставил в базу данных.

Ответы [ 6 ]

15 голосов
/ 09 августа 2011

У вас есть несколько выходных параметров, вы должны их использовать. ВОЗВРАЩАЕМЫЕ значения для кодов ошибок / состояний, а не для данных.

ALTER PROCEDURE [dbo].[sp_web_orders_insert]
    @userId ...,
    @order_ID INT OUTPUT,
    @orderReferenceOutput VARCHAR(50) OUTPUT
AS
BEGIN
    SET NOCOUNT OFF; -- WHY?????????

    INSERT INTO [web_orders] (user_ID, ...) SELECT @userId, ...;

    SELECT @order_ID = SCOPE_IDENTITY(); -- preferred over @@IDENTITY;

    -- using @order_ID here instead of SELECT MAX() twice:

    SELECT @orderReferenceOutput = 'PLC' 
        + REPLICATE('0', (7 - LEN((@order_ID+1))))
        + CAST((@order_ID+1) AS VARCHAR(5)) -- (5)? This breaks when you hit order #100,000

    RETURN; -- do not RETURN any data - it's already in your OUTPUT parameters!
END
GO
13 голосов
/ 09 августа 2011

Выполнение процедуры заканчивается после вашего первого RETURN , который «Безоговорочно завершает работу из запроса или процедуры».

RETURN @order_ID

Вместо этого рассмотрите возможность возврата обоих значений как одного набора записей с

SELECT @order_ID AS OrderID, @orderReferenceOutput AS OrderReference

в конце процедуры.

3 голосов
/ 08 февраля 2013

Удалите RETURN из исходной хранимой процедуры.

Настройте свою инструкцию вызова так, чтобы она выглядела как

DECLARE  @Id INT
DECLARE  @Reference VARCHAR(50)

EXEC [dbo].[sp_web_orders_insert],  @order_ID = @Id OUTPUT,
  @orderReferenceOutput = @Reference OUTPUT

@ Id и @Reference доступны в вашем процессе вызова.

2 голосов
/ 09 августа 2011

Вы можете иметь только один возврат в хранимой процедуре. Как только он дойдет до первого возврата, он выйдет из процесса.

Используйте операции SET для присвоения значений вашим переменным перед выдачей RETURN.

Статья Microsoft о возврате

1 голос
/ 10 марта 2012

Можно вернуть более одного выходного параметра, но, насколько мне известно, только с драйвером JDBC для Microsoft SQL Server.

Использование хранимой процедуры с параметрами вывода

0 голосов
/ 25 октября 2014

Вы должны поместить выходные данные в конец каждого вывода в операторе exec, иначе все, что вы получите, будет нулевым. Вы можете сделать простой тест, чтобы проверить это:

if(@order_ID is null)
 Print '@order_ID is null'
else
 Print '@order_ID is not null'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...