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})

关键点:

  1. 必须在SQL语句中明确指定OUTPUT关键字
  2. 存储过程调用需要使用EXEC关键字
  3. 输出参数需要使用sql.Out类型包装
  4. 确保存储过程中的输出参数已正确赋值

存储过程修正建议:

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变量将包含存储过程设置的输出值。

回到顶部