Golang中ExecContext如何返回存储过程的输出值
Golang中ExecContext如何返回存储过程的输出值
我正在使用 ExecContext 来执行一个返回 SCOPE_IDENTITY 的存储过程。然而,我收到的是零值。
tsql := "sp_CreateMetadata"
_, err = db.ExecContext(ctx, tsql,
sql.Named("Fname", fname),
sql.Named("Fsize", fsize),
sql.Named("Ftype", ftype),
sql.Named("Osuser", osuser),
sql.Out{Dest: &lastInsertId1})
alter PROCEDURE sp_CreateMetadata
-- Add the parameters for the stored procedure here
@Fname nvarchar(200),
@Fsize float,
@Ftype nvarchar(25),
@Osuser nvarchar(50),
@LastInsertID int output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO Uploads( Fname, Fsize, Ftype, OsUser ) VALUES (@FName, @Fsize, @Ftype, @Osuser)
-- Insert statements for procedure here
set @LastInsertID = SCOPE_IDENTITY()
return @LastInsertID
//also SELECT @LastInsertID = SCOPE_IDENTITY() did not work
END
更多关于Golang中ExecContext如何返回存储过程的输出值的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang中ExecContext如何返回存储过程的输出值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中使用ExecContext执行存储过程并获取输出参数时,需要正确配置输出参数并检查返回值。以下是修正后的代码示例:
tsql := "EXEC sp_CreateMetadata @Fname = @p1, @Fsize = @p2, @Ftype = @p3, @Osuser = @p4, @LastInsertID = @p5 OUTPUT"
var lastInsertId1 int64
_, err = db.ExecContext(ctx, tsql,
sql.Named("p1", fname),
sql.Named("p2", fsize),
sql.Named("p3", ftype),
sql.Named("p4", osuser),
sql.Named("p5", sql.Out{Dest: &lastInsertId1}))
或者使用更简洁的参数绑定方式:
tsql := "EXEC sp_CreateMetadata @Fname = ?, @Fsize = ?, @Ftype = ?, @Osuser = ?, @LastInsertID = ? OUTPUT"
var lastInsertId1 int64
_, err = db.ExecContext(ctx, tsql,
fname,
fsize,
ftype,
osuser,
sql.Out{Dest: &lastInsertId1})
关键点:
- 必须在SQL语句中明确指定
OUTPUT关键字 - 存储过程调用需要使用
EXEC关键字 - 输出参数需要使用
sql.Out类型包装 - 确保存储过程中的输出参数已正确赋值
存储过程修正建议:
ALTER PROCEDURE sp_CreateMetadata
@Fname nvarchar(200),
@Fsize float,
@Ftype nvarchar(25),
@Osuser nvarchar(50),
@LastInsertID int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Uploads(Fname, Fsize, Ftype, OsUser)
VALUES (@Fname, @Fsize, @Ftype, @Osuser)
SET @LastInsertID = SCOPE_IDENTITY()
END
执行后,lastInsertId1变量将包含存储过程设置的输出值。

