代码之家  ›  专栏  ›  技术社区  ›  synergetic

共享存储过程

  •  2
  • synergetic  · 技术社区  · 16 年前

    假设我有许多sql server数据库,它们具有完全相同的模式。有没有地方可以让我编写存储过程并应用于所有数据库?如果我为每个数据库创建存储过程,需要时,我必须全部更新它们。

    4 回复  |  直到 16 年前
        1
  •  6
  •   gbn    16 年前

    可以在中创建存储过程 master 在当前数据库上下文中运行的 如果 在存储过程前面加上 sp . 下面是一个例子:

    USE master
    GO
    CREATE DATABASE Test1  --for demo purposes
    GO
    CREATE PROCEDURE dbo.sp_DoStuff
    AS
    SET NOCOUNT ON
    SELECT DB_NAME()
    GO
    
    USE Test1
    GO
    EXEC dbo.sp_DoStuff
    GO
    
    USE msdb
    GO
    EXEC dbo.sp_DoStuff
    GO
    
    USE master
    GO
    DROP DATABASE Test1
    DROP PROCEDURE dbo.sp_DoStuff
    GO
    

    当然,这就是为什么通常不在 ... 引擎试图在master中解析名称

    您可以依靠延迟名称解析,不为主机中不存在的表抛出错误。

        2
  •  1
  •   roufamatic RichardJohnn    16 年前

    您将遇到的问题是表绑定——存储过程如何知道要调用哪个数据库?所以你可能想用 马克斯 的注释加上一些动态SQL,您可以在其中将数据库名称(和用户名)传递给共享存储过程。

    create proc GetAllWidgets @dbname sysname, @owner nvarchar(100)
    as
    declare @sql nvarchar(4000) 
    set @sql = 'select * from [' + @dbname + '].[' + @owner + '].Widget'
    sp_executesql @sql
    
        3
  •  0
  •   SPE109    16 年前
        4
  •  0
  •   teamchong    13 年前
    USE master;
    GO
    CREATE PROC dbo.sp_YourProc
    AS
    BEGIN
        SET NOCOUNT ON;
        SELECT DB_NAME()EXEC sys.sp_MS_marksystemobject 'ForEach';
    END
    GO
    EXEC sys.sp_MS_marksystemobject 'sp_YourProc';
    
    推荐文章