代码之家  ›  专栏  ›  技术社区  ›  John MacIntyre

如何让dbx.dbo.proca在dby的上下文中运行?

  •  0
  • John MacIntyre  · 技术社区  · 15 年前

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

    下面是一些源代码,演示了这个问题

    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表,而不是ventureworks.dbo.sysobjects。

    有人知道没有动态SQL我如何做到这一点吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   BC.    15 年前

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

        2
  •  1
  •   SQLMenace    15 年前

    动态SQL是您最安全的选择,您的另一个选择是在模型数据库中创建过程,它将在此后创建的每个数据库中都可用(但不是在当前数据库中,因此您必须将过程添加到这些数据库中)。

        3
  •  0
  •   community wiki John MacIntyre    15 年前

    我已经确定不能这样做,所以我将脚本保存为脚本文件,而不是在procs中。

    所以,我的过程将被简化为匿名块:

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

    PS这只是一个“for the record”类型的答案。

        4
  •  0
  •   Cade Roux    15 年前

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

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