为什么';tsql变量在第二次调用时是否保持其值?

为什么';tsql变量在第二次调用时是否保持其值?,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果在SSMS中运行exec存储过程命令,它将生成以下脚本: USE [MY_DB] GO DECLARE @return_value int EXEC @return_value = [dbo].[usr_DailyReportsEmpty] @username = N'someuser' SELECT 'Return value' = @return_value GO 但是,当我运行脚本时,EXEC返回16,SELECT返回0。这是为什么?在SQL Serv

如果在SSMS中运行exec存储过程命令,它将生成以下脚本:

USE [MY_DB]
GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[usr_DailyReportsEmpty]
        @username = N'someuser'

SELECT  'Return value' = @return_value

GO

但是,当我运行脚本时,EXEC返回16,SELECT返回0。这是为什么?

在SQL Server中,当执行存储过程时,返回值通常表示成功或失败。0(零)通常意味着成功。它与
SELECT
语句的结果不同。因此,您的SP可以
选择
5,但仍然会收到
返回值
为0,表示SP执行时没有错误。

在SQL Server中,当执行存储过程时,返回值通常表示成功或失败。0(零)通常意味着成功。它与
SELECT
语句的结果不同。因此,您的SP可以
选择
5,但仍然会收到
返回值
为0,表示SP执行时没有错误。

您需要更改过程以明确返回您希望捕获的值。正如Barry Kaye在上面提到的,当您简单地选择一个值来返回结果集时,过程返回0表示成功,但如果使用return语句,过程将返回该值

在下面的示例中,当执行第一个过程时,将选择1作为结果集,但@return1中捕获的值将为0表示成功。第二个过程将没有结果集,@return2中捕获的值将为3

CREATE PROCEDURE Test1
AS
    SELECT 1;
GO

CREATE PROCEDURE Test2
AS
    RETURN 3;
GO

DECLARE @return1 INT, @return2 INT;
EXEC @return1 = Test1;
EXEC @return2 = Test2;

您需要更改过程以显式返回希望捕获的值。正如Barry Kaye在上面提到的,当您简单地选择一个值来返回结果集时,过程返回0表示成功,但如果使用return语句,过程将返回该值

在下面的示例中,当执行第一个过程时,将选择1作为结果集,但@return1中捕获的值将为0表示成功。第二个过程将没有结果集,@return2中捕获的值将为3

CREATE PROCEDURE Test1
AS
    SELECT 1;
GO

CREATE PROCEDURE Test2
AS
    RETURN 3;
GO

DECLARE @return1 INT, @return2 INT;
EXEC @return1 = Test1;
EXEC @return2 = Test2;

您还可以使用输出变量,尤其是当您要返回的内容不是整数时。

您也可以使用输出变量,尤其是当您要返回的内容不是整数时。

输入存储过程的代码。可能重复输入存储过程的代码。可能重复Ah。因此,我的SP中的最后一条语句是SELECT@var,这就是为什么它显示了我期望的数字,但实际上它并没有返回该数字。它只返回0表示成功。有意思,啊。因此,我的SP中的最后一条语句是SELECT@var,这就是为什么它显示了我期望的数字,但实际上它并没有返回该数字。它只返回0表示成功。有趣,你和巴里是对的。谢谢你和巴里是对的。谢谢