我目前使用的应用程序的表有不同的模式名称,例如 Table1 可以有多个存在,比如 A.Table1 和 B.Table1。我所有的存储过程都存储在 dbo 下。我正在使用动态 SQL 编写以下存储过程。我目前使用的是 SQL Server 2008 R2,很快就会迁移到 SQL Server 2012。
create procedure dbo.usp_GetDataFromTable1
@schemaname varchar(100),
@userid bigint
as
begin
declare @sql nvarchar(4000)
set @sql='select a.EmailID from '+@schemaname+'.Table1 a where a.ID=@user_id';
exec sp_executesql @sql, N'@user_id bigint', @user_id=@userid
end
现在我的问题是, 1. 这种方法会影响我的存储过程的性能吗? 2.如果性能受到影响,那么这种场景应该怎么写程序呢?
最佳答案
解决此问题的最佳方法是重新设计,如果可能的话。
您甚至可以通过添加一个新列来替换架构来追溯实现这一点,例如:Profile
,然后将每个架构中的所有表合并到一个架构中(例如 dbo
)。
那么您的程序将如下所示:
create procedure dbo.usp_GetDataFromTable1
@profile int,
@userid bigint
as
begin
select a.EmailID from dbo.Table1 a
where a.ID = @user_id
and a.Profile = @profile
end
我为配置文件列使用了 int
,但是如果您使用 varchar
,您甚至可以保留配置文件值的架构名称,如果这有助于事情更清楚了。
关于sql-server - 在 sql server 中使用动态模式名称时编写存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35505282/