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

Sql server 2005 如何让dbX.dbo.procA在dbY的上下文中运行?,sql-server-2005,stored-procedures,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 coun

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

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

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

表计数


七十一

(1行受影响)

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


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

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

动态sql是您最安全的选择,您的另一个选择是在模型数据库中创建过程,之后创建的每个数据库都会提供该过程(但不是在当前的脚本中,因此您必须将proc添加到这些脚本中)

我确定这无法完成,因此我将脚本保存为脚本文件,而不是保存在proc中

因此,我的进程将减少到这个匿名块:

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

PS这只是一个“记录”类型的答案。

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


谢谢,但我对在master db中创建对象感到非常不舒服。我只是觉得自己错了。