sql - 返回存储过程中 OUTPUT 参数的值

标签 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 作为输出参数返回,以便另一个存储过程可以使用它。我在此示例中收到此错误:

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

最佳答案

当您的 SELECT 语句分配变量值时,SELECT 中的所有字段都必须分配给局部变量。

将您的存储过程更改为

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 存储过程中的其他值。如果您这样做,那么是的,您必须为您需要的每个值定义输出参数

关于sql - 返回存储过程中 OUTPUT 参数的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6351927/

相关文章:

sql-server - T-SQL 插入或更新

sql - 间隙和岛屿 : Splitting Islands Based On External Table

sql-server - 如何登录T-SQL

php - SQL 查询出了什么问题?

mysql - 创建一个函数将分隔字符串拆分到表中

sql - 如何强制 MERGE 语句与 DELETE 使用索引查找?

sql-server - SQL Server : set a variable in CASE statement

SQL存储过程执行计划性能不佳——参数嗅探

android - 如何在sql中打乱一列的数据?

mysql - 如何计算每学期的营业额