Возврат значения в параметре OUTPUT в sproc - PullRequest
4 голосов
/ 15 июня 2011

У меня есть хранимая процедура, которая возвращает все поля объекта.

CREATE PROCEDURE getCustomer
(
   @CustomerId int OUTPUT
)
AS
BEGIN
    SELECT @CustomerId=CustomerId,FirstName,LastName FROM Customers
END

Я хочу иметь возможность возвращать идентификатор объекта в качестве выходного параметра, чтобы его мог использовать другой sproc. Я получаю эту ошибку в этом примере:

A SELECT statement that assigns a value to a variable must not be combined with 
data-retrieval operations.

CREATE PROCEDURE getCustomer_and_more
AS
BEGIN
DECLARE @CustomerId int

EXEC getCustomer @CustomerId OUTPUT

-- call another sproc that requires this @CustomerId
END

Ответы [ 2 ]

7 голосов
/ 15 июня 2011

Когда ваш оператор SELECT присваивает значения переменных, все поля в SELECT должны назначаться локальной переменной.

Измените SPROC на

CREATE PROCEDURE getCustomer
(
 @CustomerId int OUTPUT
)
AS
BEGIN
    DECLARE @FirstName VARCHAR(50)
    DECLARE @LastName VARCHAR(50)

    SELECT @CustomerId=CustomerId, @FirstName = FirstName, @LastName =LastName 
    FROM Customers

Вам не нужноиспользуйте их переменные, но они должны быть назначены таким образом.

Ваш ЛУЧШИЙ - удалить поля.Если они не нужны, не выбирайте их.

[РЕДАКТИРОВАТЬ], чтобы ответить на ваш комментарий

Таким образом, вы можете сделать то, что вы хотите сделать, разделив присвоение переменной и выбрав другуюполя следующим образом:

CREATE PROCEDURE getCustomer
(
 @CustomerId int OUTPUT
)
AS
BEGIN

    SELECT @CustomerId=CustomerId FROM Customers

    SELECT FirstName, LastName, {A_BUNCH_OF_OTHER_FIELDS}
    FROM
        Customers

Это позволит вам получить ваш выходной параметр и выбрать все остальные данные без необходимости определять параметры для каждого поля.Вы должны взвесить простоту использования (не нужно определять много локальных переменных) и производительность (нужно запустить два оператора вместо одного).Однако мне это кажется немного странным.

Я не совсем понял, нужны ли вам другие значения из функции GetCustomer, доступные вам в getCustomer_and_more.Если да, то да, вам нужно будет определить параметры OUTPUT для каждого необходимого значения

4 голосов
/ 15 июня 2011

В запросе есть ошибка: FirstName и LastName являются избыточными.

SELECT @CustomerId = CustomerId
FROM Customers

Также я предполагаю, что в таблице «Клиенты» имеется более одного клиента.Таким образом, этот запрос вернет последний CustomerId, который, я полагаю, не тот, который вы хотите.Поэтому вам нужно добавить WHERE условие или TOP 1.

Примерно так:

CREATE PROCEDURE getCustomer  (@CustomerId int OUTPUT)
AS
BEGIN
    select @CustomerId = id
    from Customer
    where <SomeCondition>
END

[EDIT] Как вы утверждаете, что там ошибкаотсутствует в операторе SELECT, он компилируется и работает нормально, вот доказательство.Пожалуйста, попробуйте этот код, он будет работать без проблем.

CREATE PROCEDURE getCustomer
(
   @CustomerId int OUTPUT,
   @CustomerName varchar(10) OUTPUT
)
AS
BEGIN
    SELECT @CustomerId = 666, @CustomerName = 'Test'
END
GO

CREATE PROCEDURE getCustomer_and_more
AS
BEGIN
    DECLARE @CustomerId int
    DECLARE @CustomerName varchar(10)

    EXEC getCustomer @CustomerId OUTPUT, @CustomerName OUTPUT

    SELECT @CustomerId, @CustomerName
END
GO

EXEC getCustomer_and_more

Этот код вызывает вашу ошибку:

DECLARE @CustomerId int

SELECT @CustomerId = CustomerId, FirstName, LastName
FROM Customers

Это недопустимое утверждение SELECT.Попробуйте этот код, и вы увидите точно такую ​​же ошибку, как и в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...