【问题标题】:Stored procedure scope: using sp from another database存储过程范围:使用来自另一个数据库的 sp
【发布时间】:2010-10-15 17:26:53
【问题描述】:

我在一个名为的数据库中有一个名为 PROC_fetchTableInfo(从 sys.tables 中简单选择)的存储过程

Cust

我想在另一个名为

的数据库中使用此过程
Dept

我尝试使用命令在这个数据库中执行这个 sp

EXECUTE Cust.dbo.PROC_fetchTableInfo

但结果我从数据库 Cust 中获取了表。如何让这个程序在数据库部门工作?

【问题讨论】:

    标签: sql sql-server sql-server-2008 stored-procedures


    【解决方案1】:

    存储过程与其代码中的对象紧密绑定。如果Cust.dbo.PROC_fetchTable 引用了表T,则严格来说就是数据库Cust 中模式dbo 中的表T。您可以从任何其他地方调用该过程,它将始终引用此表。

    如果您需要在另一个数据库的另一个表中运行相同的过程,那么目前最好的解决方案是拥有一个新过程:Dept.dbo.PROC_fetxTableInfo。这比使用Dynamic-SQL 的替代方法要好。虽然从 DRY 和代码重用的角度来看这似乎违反直觉,但 T-SQL 是一种数据访问语言而不是一种编程语言,当您进入数据库时​​,请让您的 C/C# 思维定势。只需在Dept 数据库中有另一个过程。

    【讨论】:

    • +1, leave your C/C# mind set at the door when you enter the database
    • 这里有没有地方可以放置例如 Red Gate Multi Script?我的意思是也许我可以使用这个工具在不同的数据库上执行这个过程?
    • 从脚本生成工具生成和维护过程,并在所有感兴趣的数据库上自动部署新版本,是一种有效的做法。
    • @RemusRusanu 当您说它是“绑定”时,这是否意味着可以安全地假设 SP 中任何引用的数据库必须是 SP 所在的数据库(除非使用了巧妙的技巧)?即,你不能不小心调用别的东西吗?
    【解决方案2】:

    您的过程Cust.dbo.PROC_fetchTableInfo 查看Cust 数据库中的数据。听起来您需要在 Dept 数据库中复制它。

    或者(对我来说非常不满意)您可以添加一个参数,通过在存储过程中动态构建查询来控制要查询的数据库。

    也许您可以在某个 "Common" 数据库中创建它并像 EXEC Common..PROC_fetchTableInfo @databaseName='Dept' 一样调用它

    【讨论】:

    • +1,你可以做的不多(复制它或传入参数)
    【解决方案3】:

    这是可能的(如果您尝试编写一些可以在所有数据库中使用的实用程序函数)。您可以在 master 数据库中创建它,给它一个 sp_ 前缀并将其标记为系统对象。

    use master
    
    go
    
    CREATE PROCEDURE dbo.sp_sys_tables_select
    AS
    SELECT * FROM sys.tables 
    
    GO
    
    EXEC sys.sp_MS_marksystemobject 'dbo.sp_sys_tables_select'
    GO
    
    
    EXEC tempdb.dbo.sp_sys_tables_select
    
    EXEC msdb.dbo.sp_sys_tables_select
    

    【讨论】:

    • +1 因为这是一个很好的技巧。当然,使用不受支持的功能总是会带来与不受支持的功能相关的风险;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2019-03-22
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多