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中创建对象感到非常不舒服。我只是觉得自己错了。