SQL Server存储过程更新并返回单个值

SQL Server存储过程更新并返回单个值,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我需要调用一个存储过程,给它一个报告id(int),让它用一个确认号(varchar)(在存储过程中生成的确认号)更新一个报告表,并返回确认号(我需要它将其返回到web服务/网站) 我的存储过程代码: DECLARE PROCEDURE [dbo].[spUpdateConfirmation] @ReportID int AS BEGIN Declare @Confirmation varchar(30) = replace(replace(replace(convert(varchar(

我需要调用一个存储过程,给它一个报告id(int),让它用一个确认号(varchar)(在存储过程中生成的确认号)更新一个报告表,并返回确认号(我需要它将其返回到web服务/网站)

我的存储过程代码:

DECLARE PROCEDURE [dbo].[spUpdateConfirmation]
@ReportID int
AS
BEGIN
   Declare @Confirmation varchar(30) = replace(replace(replace(convert(varchar(16),CURRENT_TIMESTAMP,120),'-',''),' ',''),':','')+convert(varchar(24),@ReportID)
   PRINT @Confirmation

   UPDATE Report
   SET  Confirmation = @Confirmation
   WHERE ReportID = @ReportID;

   RETURN @Confirmation
END
我对存储过程的调用:

execute [spUpdateConfirmation] 2
我在表中确认插入了该值,但收到以下错误消息:

2013050219072

(1 row(s) affected)
Msg 248,16级,状态1,程序更新确认,第12行
varchar值“2013050219072”的转换溢出了一个int列。
“spUpdateConfirmation”过程试图返回NULL状态,这是不允许的。将返回0的状态

问题:我做错了什么

我知道溢出是什么,该值对于int太大,但我使用了convert to
varchar
,插入到表列类型
varchar(30)

我还在SQL中测试了该语句,它运行良好:

print replace(replace(replace(convert(varchar(16),CURRENT_TIMESTAMP,120),'-',''),' ',''),':','')+convert(varchar(24),2)
它从存储过程返回:2013050219162

仅允许整数值。具体而言,文件规定:

返回[整数\表达式]

如果要返回varchar值,可以使用输出参数

CREATE PROCEDURE [dbo].[spUpdateConfirmation]
@ReportID int, @Confirmation varchar(30) output
AS
--BEGIN
SET @Confirmation = replace(replace(replace(convert(varchar(16),CURRENT_TIMESTAMP,120),'-',''),' ',''),':','')+convert(varchar(24),@ReportID)
--PRINT @Confirmation
    UPDATE Report
    SET  Confirmation = @Confirmation
    WHERE ReportID = @ReportID;
    --RETURN @Confirmation
--END
GO
这样叫

declare @reportID int; -- set @reportID
declare @confirmation varchar(30);
exec [dbo].[spUpdateConfirmation] @reportID, @confirmation output;
-- @confirmation now contains the value set from the SP call above
如果从C#调用此函数,一个更简单的选项是选择输出作为单行、单列结果,并使用
SqlCommand.ExecuteScalar
,例如

CREATE PROCEDURE [dbo].[spUpdateConfirmation]
@ReportID int
AS
--BEGIN
DECLARE @Confirmation varchar(30);
SET @Confirmation = replace(replace(replace(convert(varchar(16),CURRENT_TIMESTAMP,120),'-',''),' ',''),':','')+convert(varchar(24),@ReportID)
--PRINT @Confirmation
    SET NOCOUNT ON; -- prevent rowcount messages
    UPDATE Report
    SET  Confirmation = @Confirmation
    WHERE ReportID = @ReportID;
    --RETURN @Confirmation
    SET NOCOUNT OFF; -- re-enable for the following select
    SELECT @Confirmation;   -- this is the value you get
--END
GO

这个错误信息是很自然的…@FreshPrinceOfSO我正在将一个日期值转换为一个varchar,我不知道转换为int列在哪里起作用。。。我编辑我的帖子也是为了展示同一个东西的简单打印版本。这只是一个警告,不是一个错误。@Kairan你不是想转换
@ReportID int
?@FreshPrinceOfSO我想RichardTheKiwi提供了答案,返回语句per说它返回一个int,因此,它将varchar强制转换为int
我不知道转换为int列的过程在哪里开始
,因为RETURN需要int,它试图将
RETURN@confirmation
隐式转换为int。SQL Server一直在做大量隐式转换啊,我刚刚想到了这一点,看到返回值为int的MS page: