SQL2005有关SSIS动态参数连接平面文件源的问题

kuangdp 2009-05-18 01:30:48
请教大虾,
我做一个SSIS包,功能是导入多个文件夹中的日志文件,文件夹是固定的,比如11,12,13 ,14分别表示各服务器的IP,然后各文件夹中就是上传的各服务器的日志文件
文件名均为 LOG20090518.log(即LOG+日期)
我目前是用FOREACH循环容器,通过脚本任务动态获取各文件夹的目录,然后在数据流任务中,动态建立 对‘目录+LOG20090518.log’的平面文件源链接,然后导入进数据库
现在就是有一个问题,如果13文件夹中上传的LOG20090518.log失败了(即不存在该日志文件),那么平面文件源的链接服务就会报错,会导致包运行失败,请教如何能控制即使找不到13的LOG20090518.log,平面文件源的链接服务失败,也不会导致整个包无法往下运行,毕竟14里面可能有日志文件的。
请SSIS高手解答,解决即结贴
...全文
966 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanwen0206 2011-10-25
  • 打赏
  • 举报
回复
在expression里面connecionString配成@[用户::inputFileNamePath] + (DT_WSTR, 4) YEAR( GETDATE() ) + (DT_WSTR, 2) MONTH( GETDATE() ) + (DT_WSTR, 2) DAY( GETDATE() ) +".log"
SvenDota 2010-11-04
  • 打赏
  • 举报
回复
你可以不用foreach和脚本 直接动态配置你的平面文件
在expression里面connecionString配成@[用户::inputFileNamePath] + (DT_WSTR, 4) YEAR( GETDATE() ) + (DT_WSTR, 2) MONTH( GETDATE() ) + (DT_WSTR, 2) DAY( GETDATE() ) +".log"

@[用户::inputFileNamePath]就是你配置的package成员指定你的磁盘路径

完了用sqlAgent定时执行你的包
kai5903051 2009-07-31
  • 打赏
  • 举报
回复
既然用foreach容器那么 里面有个设置的东东 设置要搜索的文件类型, *.txt,然后还有个选项是是否包括子目录中的文件 ,把他也勾上就ok啦,如果不存在该文件他就不会循环那个文件,如果文件存在且文件内容为空,他也会执行循环的。
辛鹤 2009-05-24
  • 打赏
  • 举报
回复
Microsoft SQL Server 2005 Integration Services (SSIS) 是生成高性能数据集成解决方案(包括数据仓库的提取、转换和加载 (ETL) 包)的平台。

  Integration Services 包括用于生成和调试包的图形工具和向导;用于执行工作流函数(如 FTP 操作)、执行 SQL 语句或发送电子邮件的任务;用于提取和加载数据的数据源和目标;用于清理、聚合、合并和复制数据的转换;用于管理 Integration Services 的管理服务 Integration Services 服务;以及用于对 Integration Services 对象模型编程的应用程序编程接口 (API)。

  SQL Server 2005 Integration Services (SSIS) 提供一系列支持业务应用程序开发的内置任务、容器、转换和数据适配器。您无需编写一行代码,就可以创建 SSIS 解决方案来使用 ETL 和商业智能解决复杂的业务问题,管理 SQL Server 数据库以及在 SQL Server 实例之间复制 SQL Server 对象。

  下列情况说明了 SSIS 包的典型用途。

  合并来自异类数据存储区的数据

  数据通常存储在很多个不同的数据存储系统中,从所有源中提取数据并将其合并到单个一致的数据集中确实有一定的难度。这种情况的出现有多个原因。例如:

  许多单位要对存储在早期数据存储系统中的信息进行归档。这些数据在日常操作中可能不重要,但对于需要收集过去很长一段时间内的数据的趋势分析来说很重要。

  单位的各个部门可能会使用不同的数据存储技术来存储操作数据。包可能需要先从电子表格以及关系数据库中提取数据,然后才能合并数据。

  数据可能存储在对相同数据使用不同架构的数据库中。包可能需要先更改列的数据类型或将多个列的数据组合到一列中,然后才能合并数据。

  Integration Services 可以连接到各种各样的数据源,包括单个包中的多个源。包可以使用 .NET 和 OLE DB 访问接口连接到关系数据库,还可以使用 ODBC 驱动程序连接到多个早期数据库。包还可以连接到平面文件、Excel 文件和 Analysis Services 项目。

  Integration Services 包含一些源组件,这些组件负责从包所连接的数据源中的平面文件、Excel 电子表格、XML 文档和关系数据库中的表及视图提取数据。

  然后,通常要用 Integration Services 包含的转换功能对数据进行转换。数据转换为兼容格式后,就可以将其物理合并到一个数据集中。

  数据在合并成功且应用转换后,通常会被加载到一个或多个目标。Integration Services 包含将数据加载到平面文件、原始文件和关系数据库时所用的目标。数据也可以加载到内存中的记录集中,供其他包元素访问。

  填充数据仓库和数据集市

  数据仓库和数据集市中的数据通常会频繁更新,因此数据加载量通常会很大。

  Integration Services 包含一个可直接将数据从平面文件大容量加载到 SQL Server 表和视图中的任务,还包含一个目标组件,该组件可以在数据转换过程的最后一步将数据大容量加载到 SQL Server 数据库中。

  SSIS 包可配置为可重新启动。这意味着可以从某个预先确定的检查点(包中的某个任务或容器)重新运行包。重新启动包这一功能可节省很多时间,尤其是包需要处理来自一大批源的数据时。

  可以用 SSIS 包加载数据库中的维度表和事实数据表。如果维度表的源数据存储在多个数据源中,包可以将该数据合并到一个数据集中,并在单个进程中加载维度表,而不是为每个数据源使用单独的进程。

  更新数据仓库和数据集市中的数据可能很复杂,因为这两种类型的数据存储区通常都包含可能难以通过数据转换过程管理的渐变维度。由于能够动态创建用于插入和更新记录、更新相关记录以及向表添加新列的 SQL 语句,因此,渐变维度向导可自动支持渐变维度。

  此外,Integration Services 包中的任务和转换可以处理 Analysis Services 多维数据集和维度。包更新了建立多维数据集所基于的数据库中的表后,您可以使用 Integration Services 任务和转换来自动处理多维数据集和维度。自动处理多维数据集和维度有助于使以下两种环境中的用户始终获得最新的数据:访问多维数据集和维度中信息的用户和访问关系数据库中数据的用户。

  Integration Services 还可以在数据加载到其目标之前计算函数。如果数据仓库和数据集市存储了聚合信息,那么 SSIS 包可以计算 SUM、AVERAGE 和 COUNT 之类的函数。SSIS 转换还可以透视关系数据,并将其转换为不太规范的格式,以便更好地与数据仓库中的表结构相兼容。

  清除数据和将数据标准化

  无论数据是加载到联机事务处理 (OLTP)、联机分析处理 (OLAP) 数据库、Excel 电子表格还是加载到文件,都需要在加载前将数据进行清理和标准化。数据可能由于下列原因而需要更新:

  数据由一个单位的多个部门提供,每个部门使用不同的约定和标准。可能需要对数据进行不同的格式处理,然后才能使用这些数据。例如,可能需要将名和姓组合到一列中。

  数据是租用或购买的。可能需要将数据进行标准化和清理以满足业务标准,然后才能使用这些数据。例如,单位需要验证所有记录使用了相同的状态缩写集或相同的产品名称集。

  数据是区域设置特定的。例如,数据可能使用不同的日期/时间和数值格式。如果要合并来自不同区域设置的数据,那么在加载数据前必须先将其转换到同一区域设置以避免数据损坏。

  Integration Services 包含一些内置转换,可将其添加到包中以清理数据和将数据标准化、更改数据的大小写、将数据转换为不同类型或格式或者根据表达式创建新列值。例如,包可将姓列和名列连接成单个全名列,然后将字符更改为大写。

  Integration Services 包还可以使用精确查找或模糊查找来找到引用表中的值,通过将列中的值替换为引用表中的值来清理数据。通常,包首先使用精确查找,如果该查找方式失败,再使用模糊查找。例如,包首先尝试通过使用产品的主键值来查找引用表中的产品名。如果此搜索无法找到产品名,包再尝试使用产品名模糊匹配方式进行搜索。

  另一种转换通过将数据集中相似的值分组到一起来清理数据。有些记录可能是重复的,所以不应未经进一步计算就将其插入到数据库中。这种转换对识别此类记录很有用。例如,通过比较客户记录中的地址可以识别许多重复的客户。

  将商业智能置入数据转换过程

  数据转换过程需要内置逻辑来动态响应其访问和处理的数据。

  可能需要根据数据值对数据进行汇总、转换和分发。根据对列值的评估,该过程甚至可能需要拒绝数据。

  若要满足此需求,SSIS 包中的逻辑可能需要执行以下类型的任务:

  合并来自多个数据源的数据。

  计算数据并应用数据转换。

  根据数据值将一个数据集拆分为多个数据集。

  将不同的聚合应用到一个数据集的不同子集。

  将数据的子集加载到不同目标或多个目标。

  Integration Services 提供了用于将商业智能置入 SSIS 包的容器、任务和转换。

  容器通过枚举文件或对象和计算表达式来支持重复运行工作流。包可以计算数据并根据结果重复运行工作流。例如,如果日期在当月,则包执行某一组任务;如果不在,则包执行另一组任务。

  使用输入参数的任务也可以将商业智能置入包中。例如,输入参数的值可以筛选任务检索的数据。

  转换可以计算表达式,然后根据结果将数据集中的行发送到不同的目标。数据划分完成后,包可以对数据集的每个子集应用不同的转换。例如,表达式可以计算日期列,添加相应期间的销售数据,然后仅存储摘要信息。

  还可以将一个数据集发送到多个目标,然后对此相同数据应用不同的转换集。例如,一组转换可以汇总此数据,而另一组转换通过查找引用表中的值并添加其他源的数据来扩展此数据。

  使管理功能和数据加载自动化

  管理员经常希望将管理功能自动化,例如备份和还原数据库、复制 SQL Server 数据库及其包含的对象、复制 SQL Server 对象和加载数据。Integration Services 包可以执行这些功能。

  Integration Services 包含专为以下目的设计的任务:复制 SQL Server 数据库对象,例如表、视图和存储过程;复制 SQL Server 对象,例如数据库、登录和统计信息;使用 Transact-SQL 语句添加、更改和删除 SQL Server 对象和数据。

  OLTP 或 OLAP 数据库环境的管理通常包括数据的加载。Integration Services 包含几个使数据大容量加载更加便利的任务。可以使用某个任务将文本文件中的数据直接加载到 SQL Server 表和视图中,还可以在对列数据应用转换后使用目标组件将数据加载到 SQL Server 表和视图。

  Integration Services 包可运行其他的包。包含多个管理功能的数据转换解决方案可分为多个包,使管理和重用包更为容易。

  如果需要在不同的服务器上执行相同的管理功能,可以使用包。包可以使用循环对服务器进行枚举并在多台计算机上执行相同的功能。为了支持 SQL Server 的管理,Integration Services 提供了可以遍历 SQL 管理对象 (SMO) 的对象的枚举器。例如,包可使用 SMO 枚举器对某个 SQL Server 安装中的 Jobs 集合中的每个作业执行相同的管理功能。

  另外,还可以使用 SQL Server 代理作业来安排 SSIS 包

  更多信息请查阅http://msdn2.microsoft.com/zh-cn/library/ms137709.aspx
Zoezs 2009-05-24
  • 打赏
  • 举报
回复
你去找剪子,他对这块比较熟。
hery2002 2009-05-24
  • 打赏
  • 举报
回复
设置一下错误冗余试试啦,
就是那个最大错误数.
没有试过,
自己试试看.
halhalhal 2009-05-21
  • 打赏
  • 举报
回复
没有这么用过:
看看这个思路可以否:
FOREACH循环嵌套FOREACH循环
第一个查看所有的目录,第二个根据得到的目录查看该目录下所有的文件

如果不可行,还可以试下这个方法:
FOREACH循环得到目录后,后面动态加上\LOG+日期.log,然后在后面加“文件系统任务”,并使用“复制文件”方法来复制刚才动态得到的日志文件,如果成功(即绿色箭头),进入下一步的导出数据的操作,如果失败(即红色箭头),直接跳出循环
Ray_Zhang 2009-05-21
  • 打赏
  • 举报
回复
我的感觉应该定义变量判断文件是否存在,然后在expressions的地方判断
kuangdp 2009-05-19
  • 打赏
  • 举报
回复
高手快来
14154 2009-05-18
  • 打赏
  • 举报
回复
不懂帮顶
kuangdp 2009-05-18
  • 打赏
  • 举报
回复
请高人指点下
kuangdp 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nalnait 的回复:]
引用 1 楼 liangCK 的回复:
不存在该日志文件,用FOREACH循环容器怎么找到这个文件?

他的意思可能是有的时候有,有的时候没有,存在可能没有的情况

我记得好像有个ifexists什么的选项,可以找找
[/Quote]


能详细说说吗?

其实我是想在脚本任务后面加个什么组件,能对返回的路径变量做判断就好了,比如不满足.log结尾,那么肯定是没找到文件,不知有没有大虾指点一二
nalnait 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangCK 的回复:]
不存在该日志文件,用FOREACH循环容器怎么找到这个文件?
[/Quote]
他的意思可能是有的时候有,有的时候没有,存在可能没有的情况

我记得好像有个ifexists什么的选项,可以找找
kuangdp 2009-05-18
  • 打赏
  • 举报
回复
是固定的某个目录下的4个文件夹,名字分别如11,12,13 ,14;这个是用FOREACH循环容器中包含脚本枚举的方式获得文件夹目录,然后动态加上\LOG+日期.log就可以构成文件路径,但是这个路径是出来了,万一文件夹上上传的LOG+日期.log不存在,就会报平面文件源链接出错,想问如何能够避免呢,请指教
liangCK 2009-05-18
  • 打赏
  • 举报
回复
不存在该日志文件,用FOREACH循环容器怎么找到这个文件?

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧