首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在存储过程中的输出参数中返回值

在存储过程中的输出参数中返回值
EN

Stack Overflow用户
提问于 2011-06-15 09:09:56
回答 2查看 3.9K关注 0票数 4

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

代码语言:javascript
复制
CREATE PROCEDURE getCustomer
(
   @CustomerId int OUTPUT
)
AS
BEGIN
    SELECT @CustomerId=CustomerId,FirstName,LastName FROM Customers
END

我希望能够将对象的id作为输出参数返回,以便其他存储过程可以使用它。我在这个例子中得到了这个错误:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-15 09:14:25

SELECT语句为变量赋值时,SELECT中的所有字段都必须赋值给局部变量。

将您的SPROC更改为

代码语言:javascript
复制
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

您不必使用它们的变量,但它们必须以这种方式赋值。

您的BETTER选项是删除字段。如果不需要它们,请不要费心选择它们。

进行编辑以响应您的评论

因此,您可以通过拆分变量的赋值并选择其他字段来完成您想要做的事情,如下所示:

代码语言:javascript
复制
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存储过程中的其他值。如果需要,则必须为所需的每个值定义输出参数

票数 7
EN

Stack Overflow用户

发布于 2011-06-15 09:13:09

查询中有一个错误:FirstNameLastName是多余的。

代码语言:javascript
复制
SELECT @CustomerId = CustomerId
FROM Customers

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

如下所示:

代码语言:javascript
复制
CREATE PROCEDURE getCustomer  (@CustomerId int OUTPUT)
AS
BEGIN
    select @CustomerId = id
    from Customer
    where <SomeCondition>
END

编辑正如您所说的,错误不在SELECT语句中,它可以很好地编译和工作,这是证据。请尝试此代码将工作没有问题。

代码语言:javascript
复制
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

这是导致您的错误的代码:

代码语言:javascript
复制
DECLARE @CustomerId int

SELECT @CustomerId = CustomerId, FirstName, LastName
FROM Customers

这不是合法的SELECT语句。尝试此代码,您将看到与问题中显示的完全相同的错误。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6351927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档