使用SSIS存储过程部署和备份



我正在尝试为我们的项目创建一个用于存储过程部署和备份的SSIS软件包。

我有一些.sql文件,每个文件包含一个存储的过程定义,该文件的名称是存储过程名称本身。我正在尝试使用SSIS

来完成以下操作
  1. 一一读取所有文件
  2. 如果存在数据库中的每个存储过程的定义
  3. 如果存在,请在其他文件夹中保存使用相同名称的定义(在我的情况下是回滚文件夹)
  4. 对于所有新sp,它保存在名为dropnewsp.sql的同一文件中,带有drop存储过程命令。
  5. 完成备份过程后,执行目标数据库中的所有文件。

我能够生成欲望.sql文件,但是我面临以下问题1.该软件包还为所有新存储过程生成了不需要的空白.sql文件2.如果存储过程对后续存储的proc

,则执行过程失败了

在此答案中,我将提供一些参考的主要步骤,以获取有关如何实现每个步骤的更多信息。即使我同意上面提到的评论,这不是SSI的工作。

  1. 添加一个foreach循环容器,该容器循环循环.sql文件并将文件名存储在变量中:

    • 用foreach循环循环循环
    • 第2-2课:添加并配置foreach循环容器
    • 加载多个源文件
  2. 添加一个表达式任务以从文件完整路径(变量)

    检索文件名
    @{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 )  )
    
  3. 在Foreach循环容器中添加执行SQL任务,以检查是否在数据库中找到存储的过程:

    SELECT COUNT(*) FROM sys.objects WHERE type = 'P' AND name = ?)
    
    • 将过程名称作为参数传递给执行SQL任务:

      • 通过SSIS任务传递变量
    • 使用结果集将计数结果存储在类型整数的变量中:

      • SSIS基础知识:使用执行SQL任务生成结果集
  4. 使用带有表达式的优先限制添加了从执行SQL任务

    的2个路径
    • 第一次使用表达式@[User::Count] == 0
    • 第二个使用表达式@[User::Count] > 0

其他参考:

  • 在SQL Server Integration Services中使用优先限制
  • 使用优先限制定义SSI中的工作流程

    1. 在第二个路径上添加执行SQL任务以使用上述相同方法获取过程定义:

      SELECT OBJECT_DEFINITION (OBJECT_ID(N'<databasename>.<schemaname>.' + CAST(? as VARCHAR(100))));  
      

并使用结果集将结果存储在变量中。

  1. 添加脚本任务以将过程定义写入目标文件

  2. 在第一个路径上添加File system task以将文件移动到指定的目录

  3. 添加另一个foreach循环以读取新文件并执行内容。

最新更新