我有大量的存储过程,我经常更新,然后转移到另一台服务器上的重复数据库。我一直在SQL Server Management Studio 2008中打开每个“storedproc.sql”文件,然后在工具栏中选择Execute,它将创建或更改现有存储过程。我一直在为每个存储过程执行此操作。
我正在寻找一种脚本(或其他方式),它允许我使用一次位于文件夹中的数据库来更改数据库上的所有存储过程。我基本上是在寻找一个类似伪代码的脚本,如下面的文字。
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文本文件。
答案 0 :(得分: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;
您需要在适当的时候投入。
答案 1 :(得分:2)
<强> For Reference 强>
c:\>for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f"
答案 2 :(得分:1)
我建议保存所有存储过程脚本文件,以if exists(...) drop procedure
开头,后跟create procedure
部分。根据需要,可选择在最后添加go
语句。
然后,您可以使用工具将所有文件连接到一个脚本文件中。
我使用自定义工具,允许我定义依赖顺序,指定批处理分隔符,脚本类型,包含文件夹等。某些文本编辑器(如UltraEdit)具有此功能。
您还可以使用Microsoft Database Project选择批量的脚本文件,并针对存储在项目中的一个或多个数据库连接执行它们。这是一个很好的起点,不需要任何额外的软件,但在项目中添加和管理文件夹和文件可能会有点麻烦。
使用诸如RedGate's SQL Compare之类的架构比较工具可用于同步两个数据库的架构和/或对象。我不建议将其用作最佳实践部署或“升级到生产”工具。