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;