sql-server - 在 sql server 中使用动态模式名​​称时编写存储过程

标签 sql-server stored-procedures

我目前使用的应用程序的表有不同的模式名称,例如 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/

相关文章:

sql-server - 如果执行带返回值的 SQL 语句,则游标不返回查询

database - PL/SQL模拟表单POST

Apache Derby 中的正则表达式

sql-server - T-SQL Json_modify 将属性附加到每个对象

sql-server - 存储过程 - 发送参数列表以与 IN 子句一起使用

sql-server - SSIS 无法访问每个人都有权访问的文件夹

具有自定义 'table-like' 输出的 mysql 过程

oracle - dbms_scheduler.run_job('jobName)无法运行

php - 为什么当我在 mysql 中调用存储过程时 pdo->lastInsertId() 返回 0?

sql - 如何在 WHERE 子句中编写条件?