当过程以动态方式编写时,无法从存储过程中获取输出变量 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
我正在编写一个过程来生成一个 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