我正在尝试为我们的项目创建一个用于存储过程部署和备份的SSIS软件包。
我有一些.sql文件,每个文件包含一个存储的过程定义,该文件的名称是存储过程名称本身。我正在尝试使用SSIS
来完成以下操作- 一一读取所有文件
- 如果存在数据库中的每个存储过程的定义
- 如果存在,请在其他文件夹中保存使用相同名称的定义(在我的情况下是回滚文件夹)
- 对于所有新sp,它保存在名为dropnewsp.sql的同一文件中,带有drop存储过程命令。
- 完成备份过程后,执行目标数据库中的所有文件。
我能够生成欲望.sql文件,但是我面临以下问题1.该软件包还为所有新存储过程生成了不需要的空白.sql文件2.如果存储过程对后续存储的proc
在此答案中,我将提供一些参考的主要步骤,以获取有关如何实现每个步骤的更多信息。即使我同意上面提到的评论,这不是SSI的工作。
添加一个foreach循环容器,该容器循环循环.sql文件并将文件名存储在变量中:
- 用foreach循环循环循环
- 第2-2课:添加并配置foreach循环容器
- 加载多个源文件
添加一个表达式任务以从文件完整路径(变量)
检索文件名@{User::FileNameWithoutExtension] = SUBSTRING (@[User::FullFilePath], LEN( @[User::FullFilePath] ) - FINDSTRING( REVERSE( @[User::FullFilePath] ), "\", 1) + 2, LEN (RIGHT( @[User::FullFilePath], FINDSTRING( REVERSE( @[User::FullFilePath] ), "\", 1 ) - 1 ) ) - FINDSTRING( REVERSE( @[User::FullFilePath] ), ".", 1 ) )
在Foreach循环容器中添加执行SQL任务,以检查是否在数据库中找到存储的过程:
SELECT COUNT(*) FROM sys.objects WHERE type = 'P' AND name = ?)
将过程名称作为参数传递给执行SQL任务:
- 通过SSIS任务传递变量
使用结果集将计数结果存储在类型整数的变量中:
- SSIS基础知识:使用执行SQL任务生成结果集
使用带有表达式的优先限制添加了从执行SQL任务
的2个路径- 第一次使用表达式
@[User::Count] == 0
- 第二个使用表达式
@[User::Count] > 0
- 第一次使用表达式
其他参考:
- 在SQL Server Integration Services中使用优先限制
使用优先限制定义SSI中的工作流程
在第二个路径上添加执行SQL任务以使用上述相同方法获取过程定义:
SELECT OBJECT_DEFINITION (OBJECT_ID(N'<databasename>.<schemaname>.' + CAST(? as VARCHAR(100))));
并使用结果集将结果存储在变量中。
添加脚本任务以将过程定义写入目标文件
在第一个路径上添加
File system task
以将文件移动到指定的目录添加另一个foreach循环以读取新文件并执行内容。