如何让dbX.dbo.procA在dbY的上下文中运行?

时间:2009-02-09 20:37:42

标签: sql-server-2005 stored-procedures

我想将一组特定的存储过程分成一个单独的数据库...有点像库。但是,当我从另一个数据库运行这些过程时,它们似乎从库数据库中调用对象。

以下是一些演示问题的源代码

use mylibdb
go

create proc gettablecount
as
begin
    declare @cnt int;
    select  @cnt=count(*)
    from    sysobjects
    where   xtype='U';
    print   'Table count : ' + cast( @cnt as nvarchar);
end
go

use adventureworks
go

exec mylibdb.dbo.gettablecount;

print '';
select  count(*) as [table count]
from    sysobjects
where   xtype='U';

运行该代码将打印出来

  

表计数:0

     

表计数

     
     

71

     

(1行受影响)

请注意,proc查询mylibdb.dbo.sysobjects表,而不是adventureworks.dbo.sysobjects。

有没有人知道如何在没有动态sql的情况下做到这一点?

4 个答案:

答案 0 :(得分:1)

您可以将库视为代码而不是数据库对象,并在使用“库”的数据库模式中创建过程。我会通过将您的过程和其他共享数据库对象存储为您可以修改和版本的CREATE脚本来实现此目的。

答案 1 :(得分:1)

动态sql是你最安全的选择,你的另一个选择是在模型数据库中创建proc,它将在你之后创建的每个数据库中可用(但不是在当前的数据库中,所以你必须添加proc到那些)

答案 2 :(得分:0)

我已经确定无法完成此操作,因此我将脚本保存为脚本文件,而不是在procs中保存。

所以,我的proc将被缩减到这个匿名块:

begin
    declare @cnt int;
    select      @cnt=count(*)
    from        sysobjects
    where       xtype='U';
    print       'Table count : ' + cast( @cnt as nvarchar);
end

PS-这只是一个'For The Record'类型的答案。

答案 3 :(得分:0)

另一种方法是在master数据库中创建sp_过程:

http://www.mssqltips.com/tip.asp?tip=1612