尝试做一个简单的ETL数据提取,就从A库提取用户信息(Sql语句拼接)到B库,操作过程中遇到3个问题:
1、除从数据源里通过SQL语句取到的字段外,还需要加入一个自定义字段SampleDate字段,yyyyMMdd格式,但是以int类型存储到目标表中。值通过参数传递。
定义了一个Int32类型的参数SampleDate,赋好值。
开始的想法是在SQL命令里像传入查询参数那样,在SELECT 后加上”,? as SampleDate“,结果预览报错:”无法唯一推导”@P1“的参数类型;两种可能类型为”sql_variant“和"xml"。“ ,说明这种方法不可取。
后来想想,这个属于新列,就用派生列试试,表达式取参数:@SampleDate,果然可行。
2、数据流任务都准备好,运行,报错如下:
检查了下,目标表中这两个字段都是字符串类型啊,没明白什么错,百度了下,得到的结果是,数据源中的字段是varchar,而目标中对应的字段是nvarchar时就会报这个错;查了下我的表里字段类型,果然是,想不到SSIS这么严谨啊,平时我都没有注意到这两个字段的类型不一样。
解决办法:
派生列里,新建列,(作为新列添加),表达式取报错的字段,如下图所示:
然后在映射里,将新的NUserName对应到目标列UserName,NCity列对应到目标列City。问题解决。
3、目标表选择组件”SQL Server 目标“ 运行时就会报错:
” SSIS 错误代码 DTS_E_OLEDBERROR。出现 OLE DB 错误。错误代码: 0x80040E14。
已获得 OLE DB 记录。源:“Microsoft SQL Server Native Client 11.0” Hresult: 0x80040E14 说明:“由于无法打开 SSIS 文件映射对象 'Global\DTSQLIMPORT ',无法进行大容量加载。操作系统错误代码为 2(系统找不到指定的文件。)。请确保您是通过 Windows 安全性访问本地服务器的。”。“
查看了组件”SQL Server 目标“的说明如下:
测试了下面两种方法,都通过。
1、把SQL Server目标的连接管理器里的数据库链接 换成本地的,运行成功。
2、把SQL Server目标 换成组件”OLE DB目标“,运行成功。