在使用动态SQL时,是否有方法将变量传递到存储过程中


DECLARE @DBNAME nvarchar(200) = 'MY_DB_NAME',
@STOREDPROC nvarchar(200) = 'dbo.Friends_SelectById',
@Id int = 2
EXEC [dbo].[Test_WithID_Proc]
@DBNAME,
@STOREDPROC,
@Id
DECLARE @SQL_QUERY NVARCHAR(4000)
SET @SQL_QUERY =  N'EXEC ' + @DBNAME + N'.' + @STOREDPROC + @Id
EXECUTE sp_executesql @SQL_QUERY, N'@Id int', @Id

这当然不会运行,但这正是我在动态传递存储过程所需的变量时所想到的。

上下文:我正在动态调用另一个具有特定存储过程名称的DB。出于测试目的,我计划调用100多个其他数据库。不需要任何输入的程序,我以相同的方式调用

您实际上根本不需要动态SQL

SQL Server支持在EXEC中使用一个变量作为过程名称。所以你可以这样做:

CREATE OR ALTER PROCEDURE Test_WithID_Proc
@DBNAME sysname,
@SCHEMANAME sysname,
@STOREDPROC sysname,
@Id int
AS
DECLARE @ProcedureName nvarchar(776) = QUOTENAME(@DBName) + N'.' + QUOTENAME(@SCHEMANAME) + N'.' + QUOTENAME(@STOREDPROC);
EXEC @ProcedureName
@Id = @Id;
GO
DECLARE @DBNAME sysname = N'MY_DB_NAME'
,@SCHEMANAME sysname = N'dbo'
,@STOREDPROC sysname = N'Friends_SelectById'
,@Id int = 2;

EXEC [dbo].[Test_WithID_Proc]
@DBNAME,
@STOREDPROC,
@SCHEMANAME,
@Id;

您连接变量的值,但随后将其作为参数传递。对象的语法也是{Database Name}.{Schema Name}.{Object Name},您已经省略了模式的名称。

我怀疑你想要这样的东西:

DECLARE @DBName sysname = N'YourDatabase',
@ProcedureName sysname = N'YourProcedure',
@Id int = 1;
DECLARE @SQL nvarchar(MAX) = N'EXEC ' + QUOTENAME(@DBName) + N'.dbo.' + QUOTENAME(@ProcedureName) + N' @Id;';
EXEC sys.sp_executesql @SQL, N'@Id int', @Id;

最新更新