【问题标题】:How to create a Stored Procedure with dynamic Schema如何使用动态模式创建存储过程
【发布时间】:2019-08-19 11:17:48
【问题描述】:
Create MySchema.MySpName
As
Begin
Select * from MyTable
End
正如您在上面看到的那样,架构MySchema 中有一个存储过程,我想动态使用这个架构。
因为我有许多具有不同架构的数据库,例如 MySchema1、MySchema2。假设我想在架构 MySchema1 中执行我上面的存储过程,所以我希望我的存储过程将使用架构 MySchema1.MySpName 创建。
任何建议。
【问题讨论】:
标签:
sql
sql-server
sql-server-2008
stored-procedures
【解决方案1】:
如果不指定架构就无法创建过程,因此在 SQL Server 中创建的任何对象都是架构绑定的,这是 SQL Server 在 SQL Server 2005 中实现的安全约束。
SQL Server 中的所有对象都必须在特定架构下。现在,在您的情况下,您有两个选择。
在数据库的每个模式中创建此过程。
在任何一个模式中创建一个过程,并在过程内部使其接受对象名称和模式名称。
示例
CREATE PROCEDURE dbo.Proc_Name
@SchemaName NVARCHAR(128),
@TableName NVARCHAR(128)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = N' SELECT * FROM ' + QUOTENAME(@SchemaName)
+ N'.' + QUOTENAME(@TableName)
EXECUTE sp_executesql @Sql
END
现在此过程将在默认架构下运行,但您可以在运行时传递架构名称和对象名称以调用来自不同架构的对象。