当过程以动态方式编写时,无法从存储过程中获取输出变量 sql

Cannot get output variable from stored procedure when procedure written in dynamic sql

我正在编写一个过程来生成一个 int 输出变量,但我不确定如何使用动态 sql 来完成此操作。如果我执行以下过程,我会在结果屏幕中显示 @AnlyNum 值,但我只想为 @AnlyNum 变量设置一个值,以便我可以使用它。谢谢。

Create procedure [dbo].[sp_test] @Db varchar(50), @RwNum int, @AnlyNum int output

As

Begin

Declare @Sql nvarchar(max) =

'Select ''@AnlyNum'' = (Select AnlyId From '+@Db+'..Test order by AnlyId desc OFFSET '+convert(varchar(10),@RwNum)+' rows fetch next 1 rows only)'

End

exec(@Sql)

这通过正确转义数据库名称并针对该数据库动态执行而不是在命令中嵌入数据库名称来消除 SQL 注入问题。此外,您不需要 @RwNum 是动态的。

CREATE PROCEDURE dbo.test
  @Db      sysname,
  @RwNum   int,
  @AnlyNum int output
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @exec nvarchar(max) = QUOTENAME(@Db) + N'.sys.sp_executesql',
          @sql nvarchar(max) = N'SELECT @AnlyNum = AnlyId 
            From dbo.Test order by AnlyId desc 
            OFFSET @RwNum rows fetch next 1 rows only);';

  EXEC @exec @sql, N'@AnlyNum int output, @RwNum int',
    @AnlyNum output, @RwNum;
END