在sproc中返回OUTPUT参数中的值

时间:2011-06-15 01:09:56

标签: sql sql-server tsql sql-server-2008 stored-procedures

我有一个存储过程,它返回一个对象的所有字段。

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

我希望能够将对象的id作为输出参数返回,以便另一个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 个答案:

答案 0 :(得分:7)

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_and_more中可用的GetCustomer sproc中的其他值。如果你这样做,那么是的,你必须为你需要的每个值定义OUTPUT参数

答案 1 :(得分:4)

查询中存在错误:FirstNameLastName是多余的。

SELECT @CustomerId = CustomerId
FROM Customers

此外,我假设您在Customers表中有多个客户。所以这个查询将返回最后一个CustomerId,我认为这不是你想要的。因此,您需要添加WHERE条件或TOP 1

这样的事情:

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

[编辑] 当您声明错误不在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声明。尝试使用此代码,您将看到与问题中显示的完全相同的错误。