为什么我无法从SQL Server 2008中的存储过程获取返回值?

CCC*_*CCC 1 sql sql-server-2008

我有这样的存储过程,

USE MyDataBaseName
GO
CREATE PROCEDURE h_sp_find_exist
@in_name varchar,@in_counterparty varchar,
@out_recordsNum int OUTPUT
AS
BEGIN
SELECT @out_recordsNum = COUNT(*)
    FROM TMyTableName
    WHERE Name=@in_name AND Counterparty=@in_counterparty
RETURN @out_recordsNum 
END
Run Code Online (Sandbox Code Playgroud)

我总是从返回值得到0.它出什么问题了?

执行代码:

use MyDataBaseName
go
declare @retRecordNum int
execute h_sp_find_exist 'myName', '50139', @retRecordNum OUTPUT
select @retRecordNum as 'RecordNumber'
Run Code Online (Sandbox Code Playgroud)

如果我只运行sql代码,选择count(*)where name ='myName'和counterparty ='50139',它可以工作,结果是1

Dam*_*ver 5

您的输入参数被截断,因为您没有为varchar提供长度,默认值为1.(你也像其他人说的那样,不需要返回声明):

CREATE PROCEDURE h_sp_find_exist
@in_name varchar(20),@in_counterparty varchar(20), --<-- changes here
@out_recordsNum int OUTPUT
AS
BEGIN
SELECT @out_recordsNum = COUNT(*)
    FROM TMyTable
    WHERE Name=@in_name AND Counterparty=@in_counterparty
END
Run Code Online (Sandbox Code Playgroud)

Return设置存储过程的退出代码.这只能是一个整数,通常用于表示成功或失败.您可以通过将其指定为exec语句的一部分来获取返回值:

declare @retRecordNum int
declare @returnCode int
execute @returnCode = h_sp_find_exist 'myName', '50139', @retRecordNum OUTPUT
select @retRecordNum as 'RecordNumber'
Run Code Online (Sandbox Code Playgroud)

在这里,@returnCode将分配传递给return语句的任何值