误删除SSIS中的“Maintenance Plans”文件夹的恢复

修复SQL Server维护计划
本文介绍如何解决在SQL Server 2005/2008中因误删MaintenancePlans文件夹而导致的维护计划问题。通过更新视图sysmaintplan_plans中的folderid,使维护计划能够正确显示。

SQL Server 2005/2008中,维护计划的功能通过SSIS包来完成。如果不小心在SSIS管理中删除了"Maintenance Plans"文件夹,则在SQL Server中建立维护计划的时候会出现问题,如下图所示。

在Management studio中创建误删除的"Maintenance Plans"文件夹,如下图所示。

建立好"Maintenance Plans"文件夹之后,可以正常建立维护计划,但是建立的维护计划并不会显示,在SSIS的"Maintenance Plans"文件夹下倒是可以找到相应的SSIS包。

出现这个问题的原因在于:维护计划向导根据文件夹名称来存储维护计划的SSIS包,但"维护计划"通过查询视图"sysmaintplan_plans"来获取维护计划相关的SSIS包的,查询这个视图的脚本,可以看到其内容

EXEC msdb..sp_helptext 'sysmaintplan_plans'

CREATE VIEW sysmaintplan_plans

AS

SELECT

...

FROM

msdb.dbo.sysssispackages AS s

WHERE

(s.folderid = '08aa12d5-8f98-4dab-a4fc-980b150a5dc8' and s.packagetype = 6)

从视图脚本可以看出,视图使用了folderid,而不是名称来获取内容,我们新建的"Maintenance Plans"文件夹基本上不可能是这个id,所以要更新这个视图,使其引用正确的folder id,正常的folder id可以执行下面的查询获得。

SELECT *

FROM msdb.dbo.sysssispackagefolders-- sql 2005 的表名为:sysdtsfolders90

WHERE foldername = N'Maintenance Plans'

AND parentfolderid = '00000000-0000-0000-0000-000000000000'

SSIS 中动态处理文件夹中的文件通常涉及以下几个关键步骤,这些步骤可以满足不同格式的文件(如 CSV、TSV 或 Excel)的导入需求,并且能够根据实际场景进行扩展。 ### 文件路径动态传递 为了实现动态处理,首先需要使用 **Foreach Loop Container** 组件来遍历指定文件夹中的所有文件。此组件允许设置一个变量来接收当前循环中读取到的文件路径。接下来,通过 **Expression Task** 或直接在连接管理器中使用表达式,将接收到的文件路径赋值给平面文件源的 `ConnectionString` 属性,从而确保每次循环都能正确读取对应的文件内容[^2]。 ### 数据流任务配置 在 Foreach Loop Container 内部添加一个 **Data Flow Task** 用于定义数据流逻辑。进入数据流编辑界面后,创建一个 **Flat File Source** 并绑定之前配置好的平面文件源管理器。这样就可以利用动态传入的文件路径来读取不同的数据源。 ### 添加派生列以记录文件信息 如果需要将文件路径信息也一同写入目标数据库,则可以在数据流中插入 **Derived Column Transformation**。通过这个组件,可以把文件路径变量作为新列添加到数据流中,以便后续操作使用[^1]。 ### 数据加载至目标数据库 最后一步是将处理后的数据加载到目标数据库表中。为此,应建立一个新的 ODBC 或其他类型的数据库连接,并利用 **ODBC Destination** 组件完成字段映射与数据插入工作。确保所有必要的字段都已正确对应,特别是那些由派生列新增加的字段[^1]。 ### 文件处理后的移动或备份 对于已经成功处理过的文件,可以借助 **File System Task** 来执行移动或者重命名等操作,将其转移到另一个位置作为归档或备份用途。这一步骤有助于保持原始文件夹的整洁,并防止重复处理相同文件[^2]。 ### 示例代码片段 - 获取 Excel 不同 Sheet 名称 当面对包含多个工作表页的 Excel 文件时,可以通过编写脚本来获取所有可用的工作表名称。以下是一个基于 C# 的示例脚本,它演示了如何通过 ADO.NET 连接字符串访问 Excel 文件并检索其内部的所有表格名称: ```csharp public void Main() { string excelFile = Dts.Variables["User::varFilePath"].Value.ToString(); string connectionStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + excelFile + ";Extended Properties=Excel 12.0"; DataTable dataTable = null; List<string> tables = new List<string>(); // 表列表 using (OleDbConnection conn = new OleDbConnection(connectionStr)) { conn.Open(); dataTable = conn.GetSchema("TABLES"); } if (dataTable != null && dataTable.Rows.Count > 0) { foreach (DataRow row in dataTable.Rows) { tables.Add(row["TABLE_NAME"].ToString()); } Dts.Variables["User::varSheets"].Value = tables; Dts.Variables["User::varSheetsCnt"].Value = tables.Count; } Dts.TaskResult = (int)ScriptResults.Success; } ``` 这段代码展示了如何利用 ADO.NET 提供者从 Excel 文件中提取模式信息,进而获取各个工作表的名字。这对于后续选择特定工作表进行数据抽取非常有用[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值