1

我有大量存储过程,我经常更新它们,然后转移到另一台服务器上的重复数据库。我一直在 SQL Server Management Studio 2008 中打开每个“storedproc.sql”文件,然后在工具栏中选择“执行”,这将创建或更改现有的存储过程。我一直在为每个存储过程这样做。

我正在寻找一个脚本(或其他方式),它允许我将数据库上的所有存储过程更改为一次位于文件夹中的存储过程。我基本上是在寻找一个脚本,它会执行类似于下面的伪代码的操作。

USE [DatabaseName]
UPDATE [StoredProcName]
   USING [directory\file\path\fileName.sql]
UPDATE [StoredProcNameN]
   USING [directory\file\path\fileNameN.sql
…

不是最干净的伪代码,但希望你能理解这个想法。我什至愿意删除所有存储过程(基于名称),然后在数据库上再次创建相同的存储过程。如果您需要更多清晰度,请随时发表评论,我提前感谢您。

进一步说明:

我正在更改 SSRS 转换项目的每个报告存储过程。开发报表后,我将报表和存储过程移至服务器。然后,我必须针对重复的数据库手动运行(ALTER 或 CREATE)每个存储过程,以便数据库现在能够支持服务器上的报告。到目前为止这还不算太麻烦,但我最终会有 65 到 85 个存储过程;如果我必须为每个字段添加一个数据集字段,那么我将不得不手动运行每个字段以更新重复的数据库。

我想要做的是有一个 SQL 脚本,上面写着:对于这个数据库,ALTER/CREATE 这个命名的存储过程,你可以在这个文件夹中找到包含详细信息的 .sql 文本文件。

4

3 回答 3

2

这是我用来将所有存储过程从一个数据库移动到另一个数据库的一些代码:

DECLARE @SPBody nvarchar(max);
DECLARE @SPName nvarchar(4000);
DECLARE @SPCursor CURSOR;
SET @SPCursor = CURSOR FOR
    SELECT ao.name, sm.definition
    FROM <SOURCE DATABASE>.sys.all_objects ao JOIN
         <SOURCE DATABASE>.sys.sql_modules sm
         ON sm.object_id = ao.object_id
    WHERE ao.type = 'P' and SCHEMA_NAME(ao.schema_id) = 'dbo'
    order by 1;

OPEN @SPCursor;

FETCH NEXT FROM @SPCursor INTO @SPName, @SPBody;
WHILE @@FETCH_STATUS = 0
BEGIN
    if exists(select * from <DESTINATION DATABASE>.INFORMATION_SCHEMA.Routines r where r.ROUTINE_NAME = @SPName)
    BEGIN
        SET @query = N'DROP PROCEDURE '+@SPName;
        exec <DESTINATION DATABASE>..sp_executesql @query;
    END;
    BEGIN TRY
        exec <DESTINATION DATABASE>..sp_executesql @SPBody;
    END TRY
    BEGIN CATCH
        select @ErrMsg = 'Error creating '+@SPName+': "'+Error_Message()+'" ('+@SPBody+')';
        --exec sp__LogInfo @ProcName, @ErrMsg, @ProductionRunId;
    END CATCH;
    FETCH NEXT FROM @SPCursor INTO @SPName, @SPBody;
END;

您需要适当地输入和输入。

于 2012-06-04T20:55:56.843 回答
2

以供参考

c:\>for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f"
于 2012-06-05T03:12:06.127 回答
1

我建议保存所有if exists(...) drop procedure以该create procedure部分开头的存储过程脚本文件。go根据您的需要,可以选择在末尾添加一个声明。

然后,您可以使用工具将所有文件连接到一个脚本文件中。

我为此使用了一个自定义工具,它允许我定义依赖顺序、指定批处理分隔符、脚本类型、包含文件夹等。一些文本编辑器,如UltraEdit具有此功能。

您还可以使用Microsoft 数据库项目来选择一批脚本文件,并针对存储在项目中的一个或多个数据库连接执行它们。这是一个很好的起点,不需要任何额外的软件,但在项目中添加和管理文件夹和文件可能会有点麻烦。

使用诸如RedGate 的 SQL 比较之类的模式比较工具对于同步两个数据库的模式和/或对象很有用。不过,我不建议将其用作最佳实践部署或“推广到生产”工具。

于 2012-06-05T16:13:26.170 回答