使用 SSIS 部署和备份存储过程
Stored Procedure Deployment and Backup Using SSIS
我正在尝试为我们的项目创建用于存储过程部署和备份的 SSIS 包。
我有一些 .sql 文件,每个文件包含一个存储过程定义,文件名就是存储过程名称本身。
我正在尝试使用 SSIS
执行以下操作
- 一一读取所有文件名
- 如果数据库中存在,则查找每个存储过程的定义
- 如果存在,则将同名定义保存在不同的文件夹中(在我的例子中是 ROLLBACK 文件夹)
- 对于所有新 SP,它使用 DROP STORED PROCEDURE 命令保存在名为 DropNewSp.sql 的同一文件中。
- 完成备份过程后,执行目标数据库中的所有文件。
我能够生成所需的 .sql 文件,但我面临以下问题
1. 该软件包还为所有新存储过程生成了不需要的空白 .sql 文件
2.如果存储过程对后续存储过程有一定依赖,则执行过程失败
在这个回答中,我将提供主要步骤和一些参考,以获取有关如何实现每个步骤的更多信息。即使我同意上面提到的评论,这不是SSIS的工作。
添加一个遍历 .sql 文件的 foreach 循环容器,并将文件名存储在变量中:
将表达式任务添加到 retrieve the file name from the File Full Path (variable)
@{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 循环容器中添加一个 Execute SQL 任务来检查是否在数据库中找到存储过程:
SELECT COUNT(*) FROM sys.objects WHERE type = 'P' AND name = ?)
将过程名称作为参数传递给执行 sql 任务:
使用结果集将计数结果存储在整数类型的变量中:
使用优先级constraints with expressions add 2 paths from the execute sql task
- 第一次使用表达式
@[User::Count] == 0
- 第二个使用表达式
@[User::Count] > 0
其他参考资料:
- Working with Precedence Constraints in SQL Server Integration Services
Defining Workflow in SSIS using Precedence Constraints
在第二条路径上添加一个 Execute SQL Task 以使用与上述相同的方法获取过程定义:
SELECT OBJECT_DEFINITION (OBJECT_ID(N'<databasename>.<schemaname>.' + CAST(? as VARCHAR(100))));
并使用结果集将结果存储在变量中。
添加一个Script Task to write the procedure definition into the destination file
在第一条路径上添加 File system task
to move the file into the directory specified
添加另一个foreach循环来读取新文件并执行内容。
我正在尝试为我们的项目创建用于存储过程部署和备份的 SSIS 包。
我有一些 .sql 文件,每个文件包含一个存储过程定义,文件名就是存储过程名称本身。 我正在尝试使用 SSIS
执行以下操作- 一一读取所有文件名
- 如果数据库中存在,则查找每个存储过程的定义
- 如果存在,则将同名定义保存在不同的文件夹中(在我的例子中是 ROLLBACK 文件夹)
- 对于所有新 SP,它使用 DROP STORED PROCEDURE 命令保存在名为 DropNewSp.sql 的同一文件中。
- 完成备份过程后,执行目标数据库中的所有文件。
我能够生成所需的 .sql 文件,但我面临以下问题 1. 该软件包还为所有新存储过程生成了不需要的空白 .sql 文件 2.如果存储过程对后续存储过程有一定依赖,则执行过程失败
在这个回答中,我将提供主要步骤和一些参考,以获取有关如何实现每个步骤的更多信息。即使我同意上面提到的评论,这不是SSIS的工作。
添加一个遍历 .sql 文件的 foreach 循环容器,并将文件名存储在变量中:
将表达式任务添加到 retrieve the file name from the File Full Path (variable)
@{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 循环容器中添加一个 Execute SQL 任务来检查是否在数据库中找到存储过程:
SELECT COUNT(*) FROM sys.objects WHERE type = 'P' AND name = ?)
将过程名称作为参数传递给执行 sql 任务:
使用结果集将计数结果存储在整数类型的变量中:
使用优先级constraints with expressions add 2 paths from the execute sql task
- 第一次使用表达式
@[User::Count] == 0
- 第二个使用表达式
@[User::Count] > 0
- 第一次使用表达式
其他参考资料:
- Working with Precedence Constraints in SQL Server Integration Services
Defining Workflow in SSIS using Precedence Constraints
在第二条路径上添加一个 Execute SQL Task 以使用与上述相同的方法获取过程定义:
SELECT OBJECT_DEFINITION (OBJECT_ID(N'<databasename>.<schemaname>.' + CAST(? as VARCHAR(100))));
并使用结果集将结果存储在变量中。
添加一个Script Task to write the procedure definition into the destination file
在第一条路径上添加
File system task
to move the file into the directory specified添加另一个foreach循环来读取新文件并执行内容。