我想将一组特定的存储过程分成一个单独的数据库...有点像库。但是,当我从另一个数据库运行这些过程时,它们似乎从库数据库中调用对象。
以下是一些演示问题的源代码
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的情况下做到这一点?
答案 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_过程: