SSIS 中 lookup控件这个控件可以实现一对多吗

SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式 - BI Work - 推酷
SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式 - BI Work
本篇文章总结了实现缓慢渐变维度的几种方式,并且分析了 Changing Attribute 和 Historical Attribute 输出的逻辑过程。
示例一:SSIS 中使用 Slowly Changing Dimension 控件
示例二:使用 SQL 中 Merge 语句实现简单的 SCD 效果
示例三:在 SSIS 中使用 Lookup, Conditional Split, Multicast 等控件实现 SCD 效果
测试表以及测试数据,其中 Customer 是数据源表,DimCustomer 模拟的是数据仓库中的 Customer 维度表。
每个示例都是从空表开始,第一次运行的时候 Dimension 表没有数据,第二次运行之前将添加几条数据到 Customer 数据源表中,并同时修改若干数据。
但是要注意这个示例对数据源数据的加载是全部加载,而不考虑基于数据源数据的增量加载,关于增量加载的实现会放在 BI 系列的其它文章中讲解。
USE BIWORK_SSIS
IF OBJECT_ID('Customer') IS NOT NULL
DROP TABLE Customer
IF OBJECT_ID('DimCustomer') IS NOT NULL
DROP TABLE DimCustomer
CREATE TABLE Customer
ID INT PRIMARY KEY IDENTITY(1,1),
FullName NVARCHAR(50),
City NVARCHAR(50),
Occupation NVARCHAR(50)
CREATE TABLE DimCustomer
CustomerID INT PRIMARY KEY IDENTITY(1,1),
CustomerAlternateKey INT,
FullName NVARCHAR(50),
City NVARCHAR(50),
Occupation NVARCHAR(50),
StartDate DATETIME,
EndDate DATETIME,
IsCurrent BIT DEFAULT(1)
INSERT INTO BIWORK_SSIS.dbo.Customer VALUES
('BIWORK','Beijing','IT'),
('ZhangSan','Shanghai','Education'),
('Lisi','Guangzhou','Student')
示例一& SSIS 中的 Slowly Changing Dimension
新建一个 Package 并拖放一个 Data Flow,在 Data Flow 中建立好与 Customer 表的数据源连接,新建 Slowly Changing Dimension SCD_DimCustomer。
双击 SCD_DimCustomer 编辑相关的属性。
Input Columns 来源于上游数据源即 Customer 表,Dimension Columns&描述 DimCustomer 表信息。
Key Type - Business Key 表示 Customer.ID 与 DimCustomer.CustomerAlternateKey 关联,后面的数据更新或者插入就跟这个 Business Key 相关。
其主要逻辑是以 Customer.ID&对比 DimCustomer.CustomerAlternateKey ,如果关联不到则表示 Customer 中有新数据则将新数据插入到 DimCustomer 中。
如果关联到则检查哪些字段是不需要更新 SCD Type 0,哪些字段的数据是需要更新的 SCD Type 1,哪些字段的数据需要重新添加一条数据以保留历史信息 SCD Type 2。
下一步设计 DimCustomer 表中几个属性字段。
City - 历史数据,如果 City 发生更改则添加一条新的数据而保留此历史信息 - Type 2。
FullName - 固定的值,此字段的数据在数据仓库中不发生更改 - Type 0。
Occupation - 可更改的值,如果 Occupation 发生更改则只修改它而不保留历史信息 - Type 1。
&在这里暂时不设置 - 如果检测到 Customer 中 FullName 发生更改就报错。
对于 Type 2 Historical Attribute 的设计是使用有效时间段来表示的,具体的理论概念请参看
&其中有详细的讲解。第一个选择是使用标志字段来表示这个记录是否到期或者是当前使用的,在我们现在的这个例子中可以先设计为有效期,后面可以修改让两种方式都存在。
推断成员的设置,暂时这里不设置推断成员。推断成员一般发生在维度表的数据载入落后于Fact事实表的数据载入,因此Fact事实表数据加载在前因此就引用不到相应的Dimension Key而造成这个问题,这个以后会专门写一篇文章来讨论推断成员。
Slowly Changing Dimension 这个控件此时会产生两个分支逻辑三组输出。
设置完了之后会自动生成其它的所有逻辑,并且已经帮助实现了 SCD 的功能。
执行之后看看具体的效果 -
分析一下 Slowly Changing Dimension 的逻辑。
其中 New Output 输出就是直接插入新的纪录到 DimCustomer 中。
Historical Attribute Insert Output 向下的 OLE DB Command 中 SQL 语句为 -
UPDATE [dbo].[DimCustomer] SET [EndDate] = ? WHERE [CustomerAlternateKey] = ? AND [EndDate] IS NULL
对于历史的数据应该是修改 EndDate 将这条数据表示终止状态,并且继续添加一条新的数据。在这里因为多添加了一个 IsCurrent 来表示记录的状态,因此这条 SQL 语句应该修改为:IsCurrent = 0,这个逻辑需要在 SSIS 中做出细微的调整。
UPDATE [dbo].[DimCustomer] SET [EndDate] = ?, [IsCurrent] = ? WHERE [CustomerAlternateKey] = ? AND [EndDate] IS NULL
Changing Attribute Update Output 向下的 OLE DB Command 1 中 SQL 语句为 -
UPDATE [dbo].[DimCustomer] SET [Occupation] = ? WHERE [CustomerAlternateKey] = ? AND [EndDate] IS NULL
对于 SCD Type 1 的属性只需要直接更改即可,因此直接根据 Customer.ID 即关联到的 DimCustomer.CustomerAlternateKey 修改相应的属性。
对于 Historical Attribute Insert Output 下的 Derived Column 和 OLE DB Command 中作出的修改:
Derived Column 新增加一个 HistoricalCurrent ,其值为0,用来表示当条记录为历史记录。
修改 SQL 语句
修改 Column Mapping
对源数据做出一定的修改:
-- 新插入一条
INSERT INTO BIWORK_SSIS.dbo.Customer VALUES
('Wangwu','Beijing','Finance')
-- 修改 Changing Attribute
UPDATE BIWORK_SSIS.dbo.Customer
SET Occupation = 'IT'
WHERE ID = 3
-- 同时修改 Changing Attribute 和 Historical Attribute
UPDATE BIWORK_SSIS.dbo.Customer
SET Occupation = 'Publisher',
City = 'Hangzhou'
WHERE ID = 2
再次执行 SSIS Package 并查询数据库结果 -
新增的一条数据是 Wangwu ,因此将直接添加新的一条记录到 DimCustomer 中。
ZhangSan 因为修改了 City ,因此属于 Type 2 SCD 需要保留历史数据。所以先修改 ZhangSan 的 EndDate 和 IsCurrent 保留这条历史数据,然后再将最新的数据添加到 DimCustomer 中,也就是最后看到的 ZhangSan - Hangzhou - Publisher
Lisi 因为修改了 Occupation 属于 Type 1 SCD 只需要修改原数据即可,所以 Lisi 的 Occupation 直接更新为 IT 即可。
下面是对 SCD Type 1 和 Type 2 实现逻辑的总结,如果理解了这些逻辑我们也完全可以用其它的 SSIS 控件来实现 SCD 的功能。
Type 2 SCD 要比 Type 1 要复杂一些,它有一个 Update 之后的 Insert 操作。
示例二 - 使用 SQL 中 MERGE 语句实现 SCD Type 1 和 SCD Type 2 的功能
SQL MERGE 语句非常实用,可以非常简单的根据一些关联条件来比较两个表的数据,然后决定匹配的逻辑如何执行和不匹配的时候逻辑如何处理。关于 SQL MERGE 的语法和使用请参照
使用 MERGE 语句来实现上面的效果
-- Type 2 SCD
MERGE INTO dbo.DimCustomer AS Dim
USING dbo.Customer AS Src
ON Dim.CustomerAlternateKey = Src.ID
WHEN NOT MATCHED BY TARGET
THEN INSERT VALUES(Src.ID,Src.FullName,Src.City,Src.Occupation,GETDATE(),NULL,1)
WHEN MATCHED AND Dim.City && Src.City
THEN UPDATE SET Dim.EndDate = GETDATE(),Dim.IsCurrent = 0
-- Type 1 SCD
MERGE INTO dbo.DimCustomer AS Dim
USING dbo.Customer AS Src
ON Dim.CustomerAlternateKey = Src.ID
AND Dim.IsCurrent = 1
WHEN NOT MATCHED BY TARGET
THEN INSERT VALUES(Src.ID,Src.FullName,Src.City,Src.Occupation,GETDATE(),NULL,1)
WHEN MATCHED AND Dim.Occupation && Src.Occupation
THEN UPDATE SET Dim.Occupation = Src.Occupation
因为在 MERGE 语句中有一些语法限制
在 Merge Matched 操作中,只能允许执行 UPDATE 或者 DELETE 语句。
在 Merge Not Matched 操作中,只允许执行 INSERT 语句。
一个 Merge 语句中出现的 Matched 操作,只能出现一次 UPDATE 或者 DELETE 语句,否则就会出现下面的错误 -&
An action of type 'WHEN MATCHED' cannot appear more than once in a 'UPDATE' clause of a MERGE statement.
Merge 语句最后必须包含分号,以 ; 结束。
所以在这里采取的方式是:
Type 2 SCD 注释的地方 - 根据 Customer.ID = DimCustomer.CustomerAlternateKey 关联如果没有找到匹配的记录,就意味是新数据,直接插入到 DimCustomer 表中。
如果匹配到了即此数据在维度表中也存在,因此先将此记录更新完毕标志此条记录为历史记录 - EndDate 和 IsCurrent 都设置了值表示 SCD Type 2。
Type 1 SCD 注释的地方 - 因为刚才的历史记录已经被标识为 IsCurrent = 0, 因此在此时的逻辑将匹配不到数据,因此作为新数据插入,这样就延续了 SCD Type 2 Update 之后的 Insert 操作。
对于匹配到的数据,再来比较 SCD Type 1 的列,如果不匹配的话那么就直接更新掉就可以了。
和示例一使用相同的测试数据和相同的数据修改方式后,执行完的效果也是一样的。
第一次执行
修改完测试数据之后再次执行
在 SSIS 中使用 Lookup, Conditional Split, Multicast 等控件实现 SCD 效果
一旦理解了 SCD 的实现逻辑,我们完全可以自己通过 SSIS 中的其它 Task 来实现 Slowly Changing Dimension。
会使用到的 Task 包括 Lookup,Multicast,Conditional Split 等。
可以参看相应的 Task 的Demo 和一些原理介绍:
新建一个 Data Flow Task 并且仍然将 Customer 表作为数据源,拖放一个 Lookup Task 并完成以下配置。
LKP_DimCustomer 中 Reference Table 引用集/引用表是 DimCustomer。
左边是Customer表,右边是要去 Look Up 的 DimCustomer,Customer.ID = DimCustomer.CustomerAlternateKey 关联。
基于 Customer.ID = DimCustomer.CustomerAlternateKey 就会有两种结果,匹配的输出和不匹配的输出。
不匹配的输出就是添加新数据。
匹配的输出就是要去检查 Historical Attribute &City& 有没有更改,如果有更改就是一次 Update 然后加上一次 Insert 操作。
如果 Changing Attribute &Occupation& 有更改就是一次 Update 操作。
中间会使用到的三个状态 - StartDate , EndDate, IsCurrent 都会在整个流程中使用到,主要用来更新它们的状态。
先实现不匹配的逻辑,即先添加一条新的数据。
DC_NewInsertStartDate 需要准备 StartDate 和 IsCurrent = 1
OLE_DST_DimCustomer 的配置
Customer.ID = DimCustomer.CustomerAlternateKey 匹配的情况下有两种情况:
City 不匹配 和 Occupation 不匹配,添加一个 Conditional Split 并连接到 Lookup 的匹配输出上。
下面是全部的实现效果 - Changing Update 下的逻辑是直接修改 DimCustomer 的数据,OLE_CMD_Update 中
UPDATE [dbo].[DimCustomer] SET [Occupation] = ? WHERE [CustomerAlternateKey] = ? AND [EndDate] IS NULL
Historical_Update 下使用了一个 Multicast 将数据流分为两个分支,因为它是 Historical Attribute Update,因此逻辑是更新原历史数据,添加新数据。
OLE_CMD_UpdateHistorical 中的 SQL 语句,这里的 IsCurrent 将最终更新为 0 。
UPDATE [dbo].[DimCustomer] SET [EndDate] = ? ,IsCurrent = ? WHERE [CustomerAlternateKey] = ? AND [EndDate] IS NULL
使用前两个示例中的测试数据,第一次执行完 SSIS Package 之后三条数据走向了 Lookup No Match Output 表示新数据。
查询数据表结果
修改完测试数据之后再次执行,数据源 1 条是新数据走向 Lookup No Match Output,1 条是 Historical Update 因此需要 Update 历史数据然后再添加一条新数据,1 条是 Changing Update 因此直接 Update 就可以了。
执行效果如下所示
那么至此,这三种对于 Slowly Chaning Dimension 缓慢渐变维度的实现就全部演示完了。从中可以发现,整个 SCD 处理的逻辑在三个示例中本质上都是一样的。都是围绕着 Business Key 匹配和不匹配的结果来展开的,并且在这个过程中区别了 SCD Type 1 和 Type 2。对于 Type 1 就是一个更新操作,对于 Type 2 不仅有更新操作而且还有插入操作。只要理解了它们的实现逻辑,使用不同的方式实现起来并不困难。
这三种方式中,第一种方式即直接使用 SSIS 中提供的 SCD Task 实现起来最为简单,基本上都是配置性的内容。但是往往因为数据量过大可能造成性能上的问题,因此才会有示例二和示例三中出现的方法。第二种方式代码更为直接,但是如果遇到多个属性变化,在代码上会有一些变化,这个需要仔细认真的检查和测试。第三种方式相对于第一种方式要花费更多的时间,但是在实现方式上可以更为灵活的满足各种需要。
我并没有基于这三个示例做出性能上的测试,因为在实际的维度变化设计中,Historical Attribute 和 Changing Attribute 可能不止一个,可能会有多个。并且维度表的大小,数据源表的大小对性能上的影响也都存在。所以在这里只是提出常用到可以解决 SCD 问题的几种方式,并且可以根据实际的需求进行缓慢维度变化设计,根据实际测试的效率高低来选择合适的方案。
写的比较多,总结如果有不足或者遗漏之处还望指出,谢谢! 另外:关于 Inferred Member 会另外专门写随笔总结!
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
[IT/计算机]ssis专家教程事实表的ETL5.4 事实表 etl 的基础知识 事实表 etl 过程中主要包括了获取维度代理键、管理度量计算和标识记录的变化。 获取维度代理键( 5.4.1 获取维度代理键(1) 在处理事实源记录(如事务或库存)时,必须从维度中拉出代理键。要实现这一点,事务源中的业务键必须与维度表中的业务键相 对应。加载维度表的过程涉及从匹配的业务键中查找代理键..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
[IT/计算机]ssis专家教程事实表的ETL
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口随笔分类 - javascript
实际工作中遇到的问题,开发环境问题,软件版本问题,软件兼容问题,代码规范问题,设计工具的使用
摘要: 1.引言RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。HTTP协议(HyperText Transfer Protocol,超文本传输协议)是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。HTTP是一个应用层协议,由请求和响应构成,...
nd 阅读(276) |
摘要: 1.为什么要用Ninject?Ninject是一个IOC容器用来解决程序中组件的耦合问题,它的目的在于做到最少配置。其他的的IOC工具过于依赖配置文件,需要使用assembly-qualified名称来进行定义,庸长且复杂常常因为打错字而破坏程序。这些是他的优点,也是为什么要选择它。Ninject同时不能进行热插拔。2.Ninject做些什么?其实Ninject做的事情很简单,说白了就是为我们选择一个想要的类来处理事务。来看下面的简单的例子。 public class Product { public int ProductID { } ...
nd 阅读(12494) |
摘要: 一直对多线程不感冒,常见的场景下用不到这种技术,所以一直不愿去了解,但是遇到一些耗时的任务时就要考虑了。下面的例子是项目中遇到的,不想说这个如何的高深,只想说我也不是很了解到底如何工作的,到底带来了多少的效率提升。书上的理论要多枯燥有多枯燥,枯燥的我都不想去动手写里面的例子,下面的例子是实际用到的,还有些意思,不管怎么说开个头吧。 1.ManualResetEvent[] doEvents = new ManualResetEvent[threadCount]; 通知一个或多个正在等待的线程已发生事件。 谁通知谁,发生的事情是指?一头雾水 2.ThreadPool.QueueUser...
nd 阅读(2154) |
摘要: 我只想说以下是很基础的sql知识,但是很容易犯错。所以睁大我们的眼睛,屏住我们的呼吸,小心的检查吧!案例1if not exists (select OrderID from CorpEmailSendQueue where orderid=) begin exec sp3_CorpEmailSendQueue_i @ID=NULL,@OrderID=, @OrderType='F', @EmailType='-2',@ResendTime=0,@SendTime=NULL,@CurrentStatus='u'
nd 阅读(290) |
摘要: 在部署fckeditor的时候可能遇到各种各样的问题,很容易就在网上搜到答案的可能大家不会在乎,我遇到的纠结了很长时间在搞定,走了一些弯路。先看看问题。部署好之后上传图片的时候浏览本地文件的时候出错。火狐错误界面如下图1图1这个图给的信息是假象,通过信息可以找到报错的代码\fckeditor\editor\filemanager\browser\default\js\fckxml.js,代码如下:FCKXml.prototype.LoadUrl = function( urlToCall, asyncFunctionPointer ){ var oFCKXml = v...
nd 阅读(4130) |
摘要: 在表中写入一条数据同事要向另外一个表中写入信息,所以会使用到事务。实际使用的时候还会一次向一个表中吸入多条数据,下面的存储过程,将字符串拆分成数组然后写入到表中。/****** Object: StoredProcedure [dbo].[sp_InsertEmployee] Script Date: 09/17/:42 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: &Autho...
nd 阅读(939) |
摘要: 一般来说Rebuild=99%*(Clean+Build),效果在非常小的可能性下会不同,一般可以忽略。Rebuild是对Solution下的所有项目,逐个进行 Clean+Build。不论文件更改与否Clean+Build是对选中的项目(如果选中Solution的话,全部Clean之后,再全部Build)先执行Clean再执行Build。一般不需要执行Clean。Build只是针对有更改过的文件进行编译。而Rebuild会编译所有。推荐用 Clean+Build 或者Build。build solution ---编译解决方案,和build “项目名”的不同之处很明显:一个解决方案可以包含多
nd 阅读(6993) |
摘要: 报错:Server Error in '/CorpOfflineHotel' Application.--------------------------------------------------------------------------------Could not load file or assembly 'System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c' or one of its dependenc
nd 阅读(1343) |
摘要: 一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试的工作。我深信实践中得到的经验是最珍贵的,书本知识只是一个引导。本篇来源于《Inside Microsoft SQL Server 2008》,有经验的高手尽管拍砖把。这个部分将讲解一些性能分析工具,这些性能分许主要关注在执行计划。缓存执行计划SQL Server 2008提供了一些服务器对象来分析执行计划Sys.dm_ex...
nd 阅读(18853) |
摘要: 今天发一个不相干的随笔,如何使用ONES。这个东西只是个工具,没有用过的话肯定会浪费一两张cd盘。这里强烈建议:没有刻录过东西的童鞋最好使用可擦写的DVD盘。今天从最简单的开始,如何从一张已知的操作系统盘刻录到一张空白的盘中。1.提取光盘镜像点击ONES程序,界面如下图1图1要往光盘里面刻录的东西不是一般程序或文件,而是镜像,镜像是个什么玩意,不解释。所以要首先从已知光盘中抓起镜像,如下图2,双击抓取镜像图2双击后弹出对话框如图3图3在光盘镜像那里选择镜像文件要存放的地方,并给它起一个名字。点击提取然后可以去喝一杯水了。上图关盘后面显示:“未准备继续”,如果光驱中插入盘这里会显示这个盘的信息。
nd 阅读(5802) |
摘要: 它山之石可以攻玉,这一篇是读别人的博客后写下的,不是原原本本的转载,加入了自己的分析过程和演练。sql语句可以解决很多的复杂业务,避免过多的项目代码,下面几个语句很值得玩味。 1. 已经知道原表year salary1 怎么查询的到下面的结果,就是累积工资year salary1 思路:这个需要两个表交叉查询得到当前年的所有过往年,然后再对过往年进行聚合。代码如下:create table #salary(years int ,salary int )in.
nd 阅读(3578) |
摘要: 1. 用一条SQL语句查询出每门课都大于80分的学生姓名 name kechengfenshu 张三 语文81张三 数学75李四 语文76李四 数学90王五 语文81王五 数学100王五 英语90思路:这里不能直接用分数&80这样的比较条件来查询的到结果,因为要求没门成绩都大于80。我们可以反过来思考,如果有一门成绩小于80,那么就不符合要求。先找出成绩表中成绩80还有一种方法类似于第一种select distinct a.姓名 from #成绩 a where not exists (select 1 from #成绩 where 分数b.自动编号 where a.学号=b.学号 an
nd 阅读(6237) |
摘要: 控制流可以被设计成并行执行,线性执行或者二者结合。控制流任务本身是线性执行的,这意味着一个任务在切换到另外一个任务之前必须先执行完毕。虽然在一个package中可以设计出相互之间没有依赖性的控制流任务,这些任务在包中仍然是线性执行的,换一种说法就是,当一个任务正在执行的时候,它不会跳到下一个任务中。SSIS执行线程会仍然停留在当前任务,知道成功执行完毕或者失败。注意:控制流同步执行和数据流的异步执行没有冲突。二者之间有一些差别。在数据流任务中主要关注的是如何处理数据,而不是控制流程。在集成服务中还允许设置最大允许的同步执行的任务的个数,通过属性MaxConcurrentExecutables可
nd 阅读(562) |
摘要: 理解控制流和数据流的一个入口是看他们如何运行的。一个控制流任务是一个最小的执行单位,它的运行结果有成功,失败,和完成,在运行它的下一个任务之前必须得到这些结果。在数据流任务中,转换时最基本的元素。一个转换任务和控制任务是有很大的区别的。转换任务之间是可以并行执行的,不必等待上一个转换任务执行完毕。 控制流和数据流之间的比较控制流和数据流之间看上去很相似,但是他们有天壤之别。控制流不会处理组件之间的数据,它负责协调单独的组件单元之间的工作。这里有一些概念:? 工作流协调? 处理导向? 顺序的或平行的任务的执行? 异步处理控制流任务可以顺序的执行,大多数时候他们会同时以这两种方式来执行。...
nd 阅读(2610) |
摘要: 简介在这一章节中我们可以深入了解SSIS的引擎结构和组成,包含下面的话题。?控制流和数据流的对比?数据流的类型?控制流中的高级话题?数据流中的缓冲器和执行树?监控数据流的执行这个章节中的内容有些抽象,我们将从一些高级话题开始一步一步地理解SSIS的内部机制。 集成服务引擎:一个比喻在了解缓存器,异步组件和执行树之前,先了解一个现象:假设在一个大城市中开着车的时候你会不会想了解整个城市的交通现状?还有整个城市的红绿灯时怎么协调的。可能你坐出租车从一个闹市区到另外一个临近的闹市区可能要花很长的时间,部分原因是红绿灯是按照一定的时限来变换的。任何一个人都可能在十字路口遇到指示灯变红,称之为锁箱。这.
nd 阅读(405) |
摘要: 你可能对扩展性这个概念非常的熟悉,当然在SSIS中也有这个概念。这里有几个很有特色的属性,这一个小节的内容中将介绍如何在SSIS中使用可扩展性特性。 扩展内存在设计SSIS之初,数据传输的操作都发生在内存中,这样会使数据传输和转换更加的快,一个设计目标是数据传输只有一条路径。这样消除了多次读取或者写入数据造成的时间消耗。这样有一个缺点是你需要大量的数据和复杂的数据转换要吃掉大量的内存,所以需要合适的对内存使用进行调优。默认情况下32位的操作系统的虚拟内存是2GB。当然我们可以修改boot.ini文件把它修改成3GB,不过这样做会导致内存不够的现象。在执行单个的package的时候经常会出现这.
nd 阅读(1295) |
摘要: 错误输出可以用来提高可靠性,但是它还有一个目的是改善可扩展性。可靠性方面,他们可以用来拷贝出错误数据。通过合适的配置可以将错误的数据从主要数据流中分离出来输出到下游系统中。这些数据将会特别处理或者是被清洗然后返回到主数据流中。他们可以被显示地合并,例如使用Union转换,或者是隐式地合并数据很少被丢弃,很多时候他们被记入日志中或者在后续步骤中处理。如果一些数据在析取的时候丢失,但是最终还是需要这些数据,错误输出可以用来解决这个问题。如果可以在其他的数据源中获得这些错误数据,可以使用LookUp转换找到这些数据。如果不能再其他的地方获得这些,可以使用默认值选项配置。在另外一些场景中,数据可能超出
nd 阅读(1911) |
摘要: 在这一个随笔中将介绍在package中如何使用事务来保证数据的完整性和一致性。在SSIS中有两种事务: 分布式事务处理事务(Distributed Transaction Coordinator Transactions):在task,package中使用单独一个或者多个事务处理 本地事务(Native Transaction):SQL Server引擎级别的事务,在一个连接中使用T-SQL中的事务注意:在SQL Server联机丛书中MSDTC是这样定义的:Microsoft 分布式事务处理协调器 (MS DTC) 允许应用程序跨两个或多个 SQL Server 实例扩展事务。此外,该协..
nd 阅读(3123) |
摘要: 可靠性和扩展性是所有系统的最终目标之一,他们两个看起来有些对立,不过通常来讲他们又有相互的联系。错误和造成错误的条件是可靠性最明显的威胁。SSIS提供了解决这些情况的优雅的方法。这个章节中要关注的特性是错误输出和检验点,使用他们来实现可靠性,他们也可以保证包的执行性能和扩展性。 重新启动一种经常遇到的情况,一个需要整夜执行的包执行失败了,需要重新执行它。如果其中一个步骤非常的耗费资源和时间,重新执行它是一件痛苦的事情。在DTS中没有类似“断点续传”的功能。重新执行一个失败的包是很容易再次出错的。由不同的策略在解决这些问问题,但是需要清楚DTS模型的工作原理,大多数DBA都没有这样的工作经验。.
nd 阅读(1898) |
摘要: 脚本组件提供另外一种在SSIS中使用脚本的方法,它只能在Data Flow中使用,不能在Control Flow中使用,它用来提供数据,接收数据,转换数据。下面是三种类型: 数据源类型:用来提供数据源,可以定义输出类型,使用脚本填充数据。了个典型的例子是使用脚本来读取复杂的文件,XML,或者更加过时的COBOL等等不能产生平面文件的文件 数据目的类型:用来将数据填充到Excel,或者平面文件,或者将文件批处理到大型机上 转换型:用来接收数据,产生新的转换数据,当SSIS提供的组件不能满足需求的时候使用 使用脚本组件这里我们举例说明如何创建和使用脚本组建,我们处理一个文件,按照需求清洗文件中的.
nd 阅读(4728) |
摘要: COM和他的后继.NET有一个特点是可以重复使用其他语言编写的程序集。SQL Server 2005版本中的脚本任务中只能使用VB.NET来实现,在这里我们可以使用任何.NET语言编写的程序集。使用程序集可以重复使用已经写好的代码,可能在你的程序中写好了数据验证的方法,现在可以在package中重用这些代码。再次写已经测试过的正在使用的代码是没有意义的。要在自己的代码中使用程序集,需要首选引用它。我们先要把程序集放在一个可以获得的路径中,并保证所在的机器中安装了.NET Framework。在Visual Studio编辑环境中添加程序集。在项目菜单中选择添加引用,如图1。图1 从列表中选择.
nd 阅读(847) |
摘要: 脚本任务主要用来控制数据流,当现有的控制流 任务不能满足复杂的设计要求的时候,就应该考虑使用脚本任务。这里我们创建第一个脚本任务,和其他的教学例子一样,我们也将创建一个简单的HelloWord程序。新建一个package 命名为ScriptTaskExample在Control Flow内拖放一个Script,如图1图1 双击打开编辑界面如图2图2 点击左边Script标签,打开界面如图3图3 这里有几个属性标签下面做一些说明a. ScriptLanguage:在这里可以设置要使用的语言。SSIS2005版本中只支持Visual Basic.NET,后续版本中添加了C#b. Precom...
nd 阅读(6356) |
摘要: 表达式是使用一些元素组合起来产生一个唯一的值。这些元素包括变量,字面值,函数,存储过程和运算符。一个简答的表达式是1&2,它的结果是true。虽然表达式是从C语言中衍生出来,但是他们大小写不明感。SSIS中很多的任务都支持表达式。所有的任务都支持使用表达式来配置属性。例如For Loop和Foreach Loop中可以使用表达式来设置循环条件,Derived Column任务可以使用表达式来定义输出。 动态属性SSIS中通过表达式可以动态的执行转换任务。右击任务选择编辑,打开编辑界面。在左方有一些归类标签,点击这些标签可以打开一类相关的属性。每一种任务都会有一个表达式标签,如图1图1 在
nd 阅读(2653) |
摘要: 数据转换服务中有执行客户SQL脚本的转换,在SSIS中这个特性得到加强。在SSIS中可以使用VB.NET这种语言。这个系列中将介绍这些脚本任务,例如控制执行流程,实现自定义转换,并举例说明。在SSIS中有下面几种脚本任务。ActiveX Script Task:这种任务允许执行ActiveX语言脚本,例如VBScript。这种任务是为了和以前版本兼容,在SQL Server 2008版本中已经被去掉,这里我们不会详细介绍。Script Task:这种任务是用来代替ActiveX script Task的,用它来控制包的执行。它允许执行VB.NET语言,很不幸只能使用这一种语言。但是还有一个选择
nd 阅读(2625) |
摘要: 在T-SQL中没有除法运算,但是在T-SQL中可以实现类似除法的操作Divide。一般除法操作的结果一个列来自于被除关系表,剩下的来自除关系表。这里举一个例子来说明。假设如下有三个表:客户Customers,销售人员Employees,订单Orders,查询返回一些客户,要求这些客户和所有美国雇员都至少有一次交易记录。来看下面一个语句:select custid from Sales.Customers as Cwhere not exists(select * from HR.Employees as Ewhere country='USA'and not exists(se
nd 阅读(4353) |
摘要: SQL语句是一种集合操作,就是批量操作,它的速度要比其他的语言快,所以在设计的时候很多的逻辑都会放在sql语句或者存储过程中来实现,这个是一种设计思想。但是今天我们来讨论另外一个话题。Sql页提供了丰富的函数供我们使用,还有很多操作有意想不到的结果,今天这个随笔来看看一些不常见到的sql语句。这些语句不像普通的增删查那样平白,它的奇妙之处有时候让人另眼相看。 1. 假设我想把Person.Contact表中所有人的名字用逗号连接起来,串成一个字符串,可能会想到使用游标把FirstName查出来然后逐行赋值给一个字符串变量,可是使用游标的代价是很大的。看看下面的代码:declare @name.
nd 阅读(2973) |
摘要: 渐变维度(SCD)转换提供了一种维护渐变维度或渐变表的方法,渐变维度的分析处理是一个很大的话题。一般一个维度表通常包含一些描述其他信息的离散值,例如,价格,重量,销售地区。问题是如果随着时间的推移这些信息改变我们将如何维护这个表,特别是在数据转移的过程中。例如我们查看AdventureWorks中的product表,如图1图1 通常在联机事务处理(OLTP)数据库中,我们会用一行的数据来保存产品信息。如果产品的售价从10美元上涨到15美元,我们直接更新StandardCost字段为15,这样做完成了任务:现在的售价是多少?但是丢失了历史数据,我们不知道涨价之前的价格是多少?价格上涨了多少?解决
nd 阅读(4718) |
摘要: 提到排名函数我们首先可能想到的是order by,这个是排序,不是排名,排名需要在前面加个名次序号的,order by是没有这个功能的。还可能会想到identity(1,1),它也给了一个序号,但是不能保证给出的序号是连续升序的。除非能够保证所有的Insert语句都能够正确成功地完成,并且没有删除操作,实际的使用中大多数的表都不能保证这样。好在SQL Server中提供了一些排名函数来辅助实现这些功能。排名函数按照需要的顺序对数据进行排名,并提供一个值对数据。下面来了解一下这些排序函数功能。 ROW_NUMBERROW_NUMBER函数允许以上升,连续的顺序给每一行数据一个序号,注意ROW_N
nd 阅读(3822) |
摘要: 透视今天抽一点时间来看看透视和逆透视语句,简单的说就是行列转换。假设一个销售表中存放着产品号,产品折扣,产品价格三个列,每一种产品号可能有多种折扣,每一种折扣只对应一个产品价格。下面贴出建表语句和插入数据语句。 1 create table SalesOrderDetail( 2 ProductID int /*unique多谢wuu00的提醒*/, 3 UnitPriceDiscount float, 4 ProductPrice float 5 ) 6 insert into SalesOrderDetail values 7 (711,.00,12), 8 (711,.00,13), .
nd 阅读(2380) |
摘要: 在模糊查找中我们提到脏数据是怎样进入到表中的事情,主要还是由于一些“Lazy-add”造成的。这种情况我们的肉眼很容易被欺骗,看上去是同一个单词,其实就差那么一个字母,变成了两个不同的单词。一个简单的例子是X-Ray Tech和xRey,我们很有可能认为他们是同一个职务,CT操作员,但是如果让计算机来处理的话,它们是两种截然不同的东西。 和模糊查找一样,模糊分组可以查找出多行中出现的类似的单词进行归类。我们可以使用这些归类得到的结果清洗数据源或者在不修改基础数据的情况下对原表进行修改。模糊分组也需要一个输入字符流,还需要一个OLE DB数据连接,用于存放分析得到的结果。模糊分组任务的编辑界面.
nd 阅读(1795) |
摘要: BI项目中经常会有一些提取,转换,数据处理(ELT)的工作,其中最主要的是处理过赃数据。假设在项目中我们向数据库中注入了测试数据,但是通过一个外键从另外一个表中载入数据的时候没有对应的数据,那么这一行就是赃数据。这时候可以使用SQL中的Sound-Ex,full-text,相似度算法等方法查找。这种策略需要花费大量的时间和精力来设计算法,测试,维护,并且它们都是基于词汇的,复用的可能性很小。也可能你会放弃自己处理并把它抛给一些有经验的高手专家来做这些工作,也可能你会在表中添加一些新的数据已达到外健关联的目的,但是这种方法被称作Lazy-add(懒惰的做法)。因为是手工添加数据难免会带来拼写错误
nd 阅读(3214) |
摘要: 和关键词提取一样,关键词查找使用相同的算法和统计模型将输入流中的字符串按照名词或者名词词组进行统计,不同的是它参照一个已经存在的词汇表,输出的统计结果也仅限于这个词汇表中的关键词。关键词提取和关键词查找可以搭配使用。定期地使用关键词提取来产生关键词词汇表,也可以在这个词汇表中人为删除或添加想要统计的关键词,最后使用关键词查找来产生最终的统计结果。在上一个章节中我们将统计结果中的“model”从统计结果中删除,然后我们可以将他们整理出来,然后删除重复的,添加一些对有统计价值的关键词。这里假设我们想统计有哪些模型招致客户的不满以致留言评价,但是我们想只保留模型的名称,而不是类似“model XX-
nd 阅读(1450) |
摘要: 如果你曾经为网站做过单词或短语分析以便获得更好的搜索排名,你会对SSIS的这个任务很感兴趣。关键词提取任务是从文本流中查找并计算关键词的出现频率的工具。它可与接收任何形式的文本,输出两列:一列是关键词,另一列是这个关键词在文本中出现的频率的统计值。这个统计值可以是该关键词出现的次数,也可以是使用稍微复杂一点的计算公式(TFIDF)计算得出的几率值。缩写词TFIDF的全称是Term Frequency and Inverse Document Frequency,是一个用于计算单词或词组在在整个文本中出现的几率。下面是这个公式的表达式:TDIDF (of a term or phrase) =
nd 阅读(1995) |
摘要: 今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起。后来在technet上搜索发现别有洞天,原来是另外一个sql关键字,t-sql的语法还是相当地丰富的。本篇是一篇学习笔记,没有什么新意,这里给出technet上的地址连接供大家参考权威:/zh-cn/library/bb510625.aspx,这里具体的语法不去深究了,只是把几个例子实际运行,剖析一番。 使用merge同时执行insert和update操作我们经常会有这样的需求,根据某个字段或多个字段查找表中的一行或多行数据
nd 阅读(4585) |
摘要: OLE DB Commond任务接受输入流中的行数据并执行一段SQL语句或自定义存储过程。这个转换和Execute Sql任务容易混淆,但是它非常类似于在ADO连接中循环接收一个结果集中的数据,创建,执行一个ADO命令。输入流中的参数数据可以提供给一个Sql命令或者存储过程。这里我们看到“循环”可能就会联想到另外一个词“性能”。这可能涉及到更新,插入,删除语句,每次都会有断开,连接的操作。但是并不意味着这个转换一无是处,这里我们着重理解这个任务如何配置和使用的。要注意有多少输入数据并在需要缓存数据到临时表或实际表时权衡性能和伸缩性,以达到最优效果。在配置这个任务的时候,基本点要点是设置能够获得
nd 阅读(4402) |
摘要: 在SSIS中的Row Count转换可以在数据流中计算数据源的行数。这种任务必须将行数保存在一个变量中。这种任务在你不想将数据行数保存在一个物理表中时会很有用。例如在ConditionalSplit任务中使用多个RowCount记录有多少行被分离出来,每个Row Count将使用变量记录分支中的数据行数,可以将这个变量值记录在数据库中,作为邮件信息发送出去,或者在下一个步骤中使用。一样这个任务需要使用高级编辑器,这个更加简单,只需要添加一个变量来存储行数。现在设想一个任务只有在数据流中的数据行数大于0的情况下才会执行,可以将此类推到任何按照不同条件执行task 的情况,在这里我们只简单举例说明
nd 阅读(2618) |
摘要: 在SSIS高级转换任务—导出列这一篇随笔中主要完成的是把数据库中的文件列导出,这里将讨论如何将文件导入到数据库中,它和导出列任务是一对经常搭配使用的任务。当我们搞清楚它们实现什么功能的时候会发现原来的名字更加贴切。这种转换将系统文件路径中的物理文件转化为数据库中的表数据,反之亦然。理解输入列任务的关键是输入源中至少有一列保存将要导入到数据库中的文件的路径,还需要目标列保存文件和文件路径。这种转换仍然使用高级编辑。就因为它是高级编辑所以不够直观,也没有类似于向导一样的设置,但是熟悉之后使用它将会很方便。在高级编辑中没有类似将两列合并成一列这样的设置所以如果源数据中文件路径和文件名字是分离的,需要
nd 阅读(2185) |
摘要: 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息,今天把自己工作过程中经常用到的一些数据库引擎存储过程,系统视图等等总结一下以备不时之用。下面的知识多是自己总结,有一些参考了MSDN。 sp_help有时候想尽快查出数据库对象的相关信息,这个存储过程就很有用了。使用它可以查询出整个数据库中所有对象的相关信息。直接运行sp_help结果如下图1,上面是数据库对象,包含系统自定义的表,视图等等,下面是自定义数据类型图1如果我只想找到某一中数据类型的长度,精度等信息可以运行sp_help datatypename,如下图2图2如果我想找出某.
nd 阅读(2906) |
摘要: 今天对分页语句做一个简单的总结,他们大同小异的,只要理解其中一个其他的就很好理解了。 使用top选项selecttop10*from Ordersa where a.orderid notin(selecttop10 orderid from Orders orderby orderid) orderby a.orderid 使用max函数这种方法的前提是有唯一值的一个列。selecttop10*from Orders a where a.orderid&(selectMAX(orderid) from (selecttop10 orderid from Orders orderby o
nd 阅读(993) |
摘要: T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了。这时可以借助CLR了,我们可以在SQL Server 2008中扩展C#程序来完成循环等过程式的查询,或者其他SQL不便实现的功能。这个随笔中将介绍在SQL Server中扩展C#程序实现正则表达式的替换功能。新建一个类库程序命名为Regex,打开Visual Studio 2008,点击File,点击New,点击Project,在弹出的New Project对话框中选择Class Library,项目名称为Regex。将项目中的类Class1命名为Regex,在这个类中写入如下代码:us..
nd 阅读(6306) |
摘要: 上一个随笔中我们提到了在Windows 7操作系统中配置ftp服务器并通过WinScp客户端来访问它,这样就可以方便的上传下载文件了。现在又有新的问题,我们发现如果项目中的文件很多,成百上千个文件,即使WinScp提供方便的文件拖拽功能,还是发现很繁杂。也许你会想到在dos中使用move命令,但是这个包含了cmd,cd,move等好几个命令,也是很费时间的。我们试图找到一种自动执行的程序,每隔一段时间来执行一次上传下载,这样我们的工作就很轻松了。这一次我们将使用dos命令做成bat文件,然后使用Task Scheduler调度bat来完成这个机械的,呆板的任务。感慨一下,只要我们想得到的,机器
nd 阅读(6475) |
摘要: 好久没有碰IIS服务器了,又忘的差不多了,这个随笔中我将介绍在Windows 7操作系统中通过IIS配置ftp服务器的步骤。在公司的网络环境中阻止了ftp访问,在这里我们使用工具WinScp作为客户端访问ftp服务器,WinScp作为一个小型的ftp客户端非常小巧灵活,它可以访问ftp,sftp,scp等服务。下面我们新建一个ftp服务,然后用WinScp访问这个站点。打开IIS中ftp服务。默认情况下在IIS服务器中不会开启ftp站点服务,所以需要我们手动打开该服务。依次点击Control Panel\All Control Panel Items\Programs and Features
nd 阅读(5782) |
摘要: 在上一个导入列这个例子中我们创建一个实际的表来存储文件路径,在生产环境中我们可能不会创建一个实际的物理表来存储这些信息,而是创建临时表。这里有一个小小的技巧,在Control Flow中拖放两个Execute SQL task,一个创建临时表,另一个销毁临时表,执行这个package,会遇到一个错误,在Progress中提示信息显示不存在这个临时表。错误信息如下:Error: 0xC002F210 at Execute SQL Task 1, Execute SQL Task: Executing the query &drop table #Table1& failed
nd 阅读(1940) |
摘要: 好久没有写SSIS了,接着上回的Import Column,这个随笔学习Export Column,这个转换任务用来从数据库中的blob类型的列转换成文件保存到文件系统中或者在Microsoft Word文件或者Microsoft Paint文件中浏览。执行这个task的关键是要有一列包含文件的数据和要导出文件的路径。Export Column会将数据列转换成物理文件,并按照完全限定的路径保存这些文件。在下面的例子中,将把数据库AdventureWorks中的一个文件列导出。如果你安装了数据库AdventureWorks,在这个数据库中有一个包含文件的表 [Production].[docum
nd 阅读(2150) |
摘要: 今天同事安装MOSS 2007(32位)遇到了一个错误。我记得以前装过,觉得功能很强大的,所有的东西不管什么放在sharepoint里面就变成两样,一个是列表,一个是文件,并且全部都是自动生成数据表的,我的理解可能很简单。下面我们来看看具体的问题。点击setup.exe,就弹出一个对话框提示:The product requires ASP.NET v2.0 to be set to ‘Allow’ in the list of Internet Information Service(IIS) Web Server Extensions. … …. 如下图1图1这个问题很明显,说明IIS服务
nd 阅读(1011) |
摘要: 数据库中的数据编辑是我们遇到的最频繁的工作,这一个随笔中我来总结一下最常用的数据编辑。 select into经常遇到一种情况是,我们希望创建一个新表,表中的数据来源于原有的一个表;原有一个表,但是这个表中的数据已经很混乱,我们希望把这些数据备份出来,然后把原有的表中的数据清除,重新导入;在这些情况下我们可以使用select into语句。如果当前用户拥有建表权限,在select语句使用关键字into可以在数据库中创建新的 表。这个语句只需要把into new_table_name加到选择出的列名之后,from关键字之前,当然数据可以来源于一个或多个表中。需要说明的是在新表中只包含select
nd 阅读(2011) |
摘要: 要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据。 sys.dm_os_wait_stats这是一个系统视图,里面存储线程所遇到的所有的等待信息,具体的列如下表列名数据类型说明Wait_typeNvarchar(60)等待类型名称waiting_tasks_countBigint等待类型的等待数。该计数器在每开始一个等待时便会增加。Wait_time_msBigint该等待类型的总等待时间。Max_wait_time_msBigint该等待类型的最长等待时间。Signal_wa
nd 阅读(2312) |
摘要: 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support 1 media families, but 2 media families are expected according to the backup device specification”。如下图:解决办法是首先选中击上一次备份的文件,点击Remove,去掉当前的备份文件,然后再点击OK备份。这样才能正确的备份。也在微软帮助文档里面看过原由,实在内容太多没有时间细看。还原数据库,又遇到了数据库里面的小把戏,还原的时候发现在文件夹内找不到bak文件,选择All Files(*)之后才能显示出来。
nd 阅读(1892) |
摘要: 在SQL Server 2005的beta版本中导入列任务命名为插入列转换,他和导出列任务是一对经常搭配使用的任务,在SQL Server 2005的beta版本中导出列任务命名为文件抽取。当我们搞清楚它们实现什么功能的时候会发现原来的名字更加贴切。这种转换将系统文件路径中的物理文件转化为数据库中的表数据,反之亦然。理解输入列任务的关键是输入源中至少有一列保存将要导入到数据库中的文件的路径,还需要目标列保存文件和文件路径。这种转换的主要配置仍然使用高级编辑。我们称之为高级编辑可能就因为它不够直观,有点麻烦,也没有类似于向导一样的设置,但是熟悉之后使用它将会很方便。在高级编辑中没有类似将两列合并
nd 阅读(1843) |
摘要: 下面的随笔中将讲述SSIS中的高级转换任务,和老旧的SQL Server 2000 DTS相比,我们会发现现在以前的dark-arrow,data-pump任务没有了。在转换任务中隐藏ActiveX脚本和嵌入连接字符的方法也被去除了。在将Package指向不同的数据库的时候也不会忘记修改转换对象,在修改对象连接的时候也一样。现在新建全局连接。转换任务可以被更加容易的管理,使用便捷界面可以浏览任务的设计界面并修改属性。在使用SSIS package的时候,有些时候需要避免一些过度依赖的情况。没有必要在package中使用ActiveX脚本任务暴力的解决一些很复杂问题。事实上如果一开始就过度依赖脚
nd 阅读(9312) |
修改机器登录密码后不能登录SQL Server今天发现一个很有趣的现象。公司的电脑每两个月就会提示重置登录密码,今天我修改了密码登录进去发现不能登录SQL Server了,我的是2008版本的 。这就奇了个怪了,以前也改过好几次密码的啊, 今个怎么就不行了。后来在老员工的提示之下,原来需要重新设置SQL Server的所有service的密码。如图。打开service,右击SQL Server(SQLEXPRESS),点击Log On标签,修改密码。然后再次登录,这回就可以了。如果还有其他的SQL Server对象不能登录,也要修改相应的service。 2011-9-.
nd 阅读(2713) |
摘要: 今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊。看了一位博主的文章,自己添加了一些内容,做了简单的总结,这个语句还是第一次见到,学习了。我从简单到复杂地写,希望高手们不要见笑。下面的sql语句设计到三个表,表的内容我用txt文件复制进去,这里不妨使用上一个随笔介绍的建立端到端的package的方法将这些表导入到数据库中,具体的就不说了。从这里下载文件employees.txt,customers.txt,orders.txt参考文章:/wwan/archive//1964279.html
nd 阅读(11070) |
摘要: 通过基本task和transforms的学习,现在可以转入到SSIS实际应用。建立端到端的package这个系列中首先讲解将一系列的文件数据导入到SQL Server中的方法,然后添加一些复杂转换,最后将看到如何在package中处理错误和动态地创建package。 创建一个项目使用SSIS的首要目的是从数据源中读取数据,然后写入Destination中,这个向导介绍从平面文件中读取数据。使用下面的文字Zipcode State ZipName32008 FL BRANFORD32009 FL BRYCEVILLE32011 FL CALLAHAN32013 FL DAY32033 FL EL
nd 阅读(4593) |
摘要: 数据视图是SSIS中常见的调试工具,它的功能是在包运行的时候查看数据。例如如果在Aggregate转换的前,后分别放置一个数据视图,尅查看数据在进行聚合操作之前和之后的数据。 但是如果将package部署或者作为job的一个步骤运行,数据视图将不会显示出来。有四种类型的数据视图。表格Grid:在一个时间点显示数据快照直方图Histogram:使用柱状图显示数据的分布散布图Scatter Plot:使用二维分布图显示数据分布柱状图Column Chart:使用柱状图显示数据分布右击绿色连线选择Data Viewers,打开编辑数据界面,如图4-39,选择数据视图的类型并重命名。在Metadata
nd 阅读(1985) |
摘要: 在上一个随笔中我们熟悉了数据流任务,现在来做一个例子,通过实践学习这些介绍的内容。这个例子从AdventureWorks数据库中取得数据,然后对数据进行聚合,排序,计算产生新列操作并输入到一个.csv文件中。新建一个新的package将它重命名为AdventureWorksExtract.dtsx,在control flow中拖放一个数据流任务,双击进入data flow 界面在data flow界面内拖放一个OLE DB数据源,右击重命名为TransactionHistory,双 击打开编辑界面AdventureWorks数据库连接如果已经存在就直接选择它,如果不存在点击新建一个连接新建连接
nd 阅读(1574) |
摘要: 在上一篇随笔中列举了部分Data Flow中的数据转换任务,这里继续剩余的转换任务。 数据挖掘请求数据挖掘任务是SSIS中一个很重要的任务,它的思想来源于一些算法。数据挖掘请求运行数据挖掘请求,并将结果输出到数据流。它还可以添加一些预测新列,一些应用场合如下列举:根据已知的一些列,例如子女个数,家庭收入,配偶收入预测产生一个新列:这个人是否拥有住房根据客户购物卡预测客户的购买意向可以填充用户的调查问卷上没有填写的空白栏涉及到的算法有:微软时序算法微软决策树算法微软线性回归算法贝叶斯算法 模糊排序和查找模糊排序task可以找出数据中可能重复的行,例如可以找出包含“Main St.”和“Main
nd 阅读(2315) |
摘要: 对数据流来说按照需求将数据转换成需要的格式是数据操作中的一个关键的步骤。例如想要得到聚合排序后的运算结果,转换可以实现这种操作。和SQL Server 2000 DTS完全不同,这些操作不需要编写script,所有的运算都在内存中进行。添加一个数据转换之后,数据直接转换成想要的格式然后传递给下一个步骤,由于是在内存中完成运算操作的,不需要在数据库中建立对象来存储这些操作函数。但是当需要处理大批量的数据时,还是需要建立存储表或其他对象来处理的。在data flow面板中拖放一个转换,鼠标点住然后拖放绿色连线到一个目的Destination,然后就可以双击并编辑这个转换。这部分将从最基本的功能开始
nd 阅读(3164) |
摘要: 我们可以把SSIS中的整个package包含在一个事务中,但是如果在package的执行过程中有一个表需要锁定应该怎么处理呢?SSIS内建的事务处理可以解决这个问题。在此之前首先来熟悉一下SQL Server中的事务的概念。 事务SQL Server中的事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中永久的组成部分。如果事务遇到错误且必须取消或回滚,则所有的数据修改均被清除。在SQL Server中使用事务有可能会造成一些预想不到的结果,具体来说有脏读,不可重复读和幻读三种结果。脏读:脏读是指当一个事务正在访问数据库,并且对数据进行修改,而这种修改还
nd 阅读(2228) |
摘要: 在Data Flow中Destination从数据源或者数据处理流程中接收数据。在SSIS中数据可以导入到任何OLE DB支持的数据源,平面文件或者Analysis Service中的数据。和数据源一样Destinations也通过连接管理器来连接,不同之处是有一个数据映射界面如图4-11。图4-11只有在连接到数据流之后才可以配置Destinations,使用绿色箭头将数据源或者数据流和Destinations连接起来。如果在连接之前就配置Destinations会得到如图4-12的警告提示。图4-12 数据挖掘模型接收器Data Mining Model Training数据挖掘模型可以接
nd 阅读(1816) |
摘要: 在SSIS中大多数的数据源都指向一个连接管理器,通过指定连接管理器可以在Package中重复使用连接,这样只需要修改一次就能重新设置所有连接,在SSIS中有6中不同的数据源。 OLE DB数据源OLE DB数据源用来连接OLE EB数据,是一种最常用的数据源。点击上方Data Flow标签,拖放一个OLE EB Source双击这个数据源打开编辑界面如图4-8,从OLE DB Connection manager下拉列表中选择要连接的数据库图4-8在VS2005中标签Data Access Mode设置如何检索数据,它有两个选项,Table/View和SQL Command,或者可以从变量中获
nd 阅读(1813) |
摘要: 容器容器是SSIS为一个或多个任务提供一种结构的对象。例如可以执行一个循环直到到达边界条件,或者将一系列的task按逻辑组织在一起。一个容器也可以包含其他的容器。容器和任务(task)一样也放在Control Flow标签内,总共有四种类型的容器:任务宿主Task Host,Sequence序列,For循环和Foreach循环。任务宿主Task Host Containers任务宿主是单个task的默认容器,你在工具栏中找不到这种工具的图标,实际上即使不选择一个容器,单个task仍然包含在一个任务宿主中。SSIS的结构通过任务宿主来扩展变量和事物控制。Sequence容器Sequence容器可
nd 阅读(2777) |
摘要: 今天将所有的SSIS文章总结到一个文章中,做一个简单的目录,便于查找。SSIS是微软的一个智能解决方案,通俗点和ASP.NET程序差不多,它也设计了很多的类似控件的东西,不过叫任务,这些任务的主要功能是将数据从数据源转到数据目的,中间也会有查询,聚合等等更加具体的任务。只要对SQL Script足够的熟悉,对这些东西不会有丝毫的神秘感。这个系列的文章是阅读书本,实际操作验证,然后将他们赋之文字,没有什么技术含量,欢迎大家交流学习。SSIS常用的包—通用的属性SSIS常用的包—执行任务SSIS常用的包—大量插入任务(Bulk Insert task)SSIS常用的包—使用Bulk Insert执
nd 阅读(4822) |
摘要: Windows Management Instrumentation (WMI)是Windows的最高机密之一,它允许你通过一个脚本界面来管理Windows平台。WMI数据读取任务通过WQL语言(WMA专用语言)来接触管理服务器或者工作平台(例如查看系统日志)。查询语句可以将结果输出到变量中。WMI数据读取任务可以完成下面的工作。在事务日志中查询可能的错误信息查询正在运行的应用程序查询在包运行过程中有多少可用RAM判断有多少可用的磁盘空间 在编辑界面中可以配置WMI数据读取任务,如图3-22。首选在WMI连接管理界面新建一个WMI连接,WQLQuerySourceType属性设置是否直接输入.
nd 阅读(1278) |
摘要: Web服务任务是一个在SSIS中新添加的任务,它可以连接一个webservice并执行服务中的一个方法。执行方法之后可以将结果写回到一个变量或者文件中。这个任务适合处理第三方应用中的信息。例如可以利用这个任务执行webservice中的方法获得亚马逊的更新后的产品列表,并把这些信息写入到本地的服务器中。 在web服务任务 的编辑页面中的HttpConnection选项中打开HTTP Connection Manager Editor新建一个HTTP连接。与OLE DB连接有些不同的是HTTP连接使用一个URL,指定到一个.ASMX文件。如果你想体验一下这种连接,可以登录www.xmethod.
nd 阅读(1004) |
摘要: 通过消息队列任务可以从Microsoft Message Queuing (MSMQ)中接收或向它发送消息。消息的格式可以是字符串,文件或者变量。消息队列任务的优点是你可以在package正在运行的时候相互通信。可以通过这种任务可以扩展package,让多个package平行执行,在检验点检验得到的数据。这个任务还可以通过网络分发文件。例如,在运行的时候通过消息队列想不通的办公室分发文件,接收文件的SSIS包可以下载文件到各自的SQL Server中。 在编辑页面,可以通过MSMQConnection配置MSMQ连接管理,在Message栏中选择是发送还是接收消息。在这个编辑页面中还可以通过.
nd 阅读(684) |
摘要: 这种任务可以通过SMTP发送Email。在SQL Server 2000中需要通过MAPI来发送email,这意味着需要在执行package的机器上需要安装Outlook。这里不再需要安装Outlook也能发送email。发送Email任务的编辑页面如图3-19,SMTPConnection选项用来配置SMTP连接。 图3-19 大多数的配置选择项是见名知意的,MessageSourceType选项用来指定邮件消息是从一个文件中读取还是直接填写在MessageSource选项中。
nd 阅读(697) |
摘要: 脚本任务允许利用Microsoft Visual Studio环境来使用VB.NET语言创建和执行脚本。ActiveX任务允许从SQL Server 2000中执行脚本。与ActiveX任务相比,脚本任务有一些优点。如下列举。一整套智能设计环境轻松地向脚本传递参数轻松地在脚本代码中设置断点可以以二进制形式预编译脚本在脚本任务的编辑界面内如图3-17有一个脚本语言选项用来选择编辑语言,对于SQL Server来说只能选择VB.NET。如果PreCompileScriptIntoBinaryCode选项设置为true,脚本将会编辑并加快任务运行,这样做的副作用是package将会变大。 图3-17
nd 阅读(1482) |
摘要: 执行程序包任务Execute Package task可以从当前package中执行子程序包中的一个package,在SQL Server 2000 DTS中这中任务是不存在的。在图3-16中你可以看到package标签下的ExecuteOutofProcess属性,将它设置为true,它将执行子过程中的任务。这个任务的默认设置是true,这需要耗费更多的内存,但是会提高任务的执行性能。另外一个和SQL Server 2000不同的地方是它不再将参数放在子任务中,子任务将会从父任务中取得配置值。 图3-16双击图标,打开编辑页面。首先设定package在哪里运行,在location下拉列表框.
nd 阅读(580) |
摘要: FTP任务允许你通过FTP来接收和传送文件。在SQL Server 2000中只能通过它来接收文件。在SSIS中对它进行了大量的改进。可以接收,删除本地或者远程服务器上的文件。也可以在本地或远程服务器上创建文件。在FTP任务编辑页面上可以通过FTP Connection Manager设置FTP站点链接信息。如果没有设置连接,可以选择New Connection来新建一个连接。FTP Connection Manager的界面和OLE DB Connection Managers有一些不同,如图3-9。Server Name选项设置FTP地址,大多数FTP服务的端口都是21。另外一个重要的设置
nd 阅读(2980) |
摘要: 根据url截图
nd 阅读(938) |
摘要: SQL点滴
nd 阅读(640) |
摘要: [代码]园子里面有类似的代码/somesongs/archive//xmlhelper.html,不过这个没有给出具体方法体,所以没法看到释放资源的那块,本来就是想看看怎么处理性能问题的。下面是一些具体例子。已知有一个XML文件(bookstore.xml)如下:&?xml version="1.0" encoding="gb2...
nd 阅读(3192) |
摘要: 项目需要将Access数据库中的数据导入到SQL Server中,需要检验导入后的数据完整性,数据值是否正确。我们使用的是Microsoft SQL Server 2008 Migration Assistant for Access这个工具,次工具专门用来将Access中的数据库导出到SQL Server中,我们的疑虑是这个导出过程中会不会因为认为的原因导致数据错误或者数据之间的关联丢失,看起来有点多次一举,但是还是找方法来做测试。于是就产生了今天的问题,怎么从SQL Server中找出所有的数据列的类型,字段大小,是否可为空,是否是主键,约束等等信息。我找很多资料鼓捣出这个存储过程,先来看
nd 阅读(1330) |
摘要: 偶然在电脑里看到以前保存的这个函数,是将一个单独字符串切分成一组字符串,这里分隔符是英文逗号“,” 遇到其他情况只要稍加修改就好了CREATE FUNCTION dbo.f_splitstr( @str varchar(8000))RETURNS @r TABLE(id int IDENTITY(1, 1), value varchar(5000))ASBEGIN/* Function body */ DECLARE @pos int SET @pos = CHARINDEX(',', @str) WHILE @pos & 0 BEGIN INSERT @r(value)
nd 阅读(1754) |
摘要: 文件系统任务主要考虑到一些大型机系统,例如你想在夜间活动少的时候从一个系统导入数据:
从大型机或者FTP原系统中接收文件
Package接收文件并转移到另一个路径下
从文件中抽取数据,然后将文件归档到其他的目录中 在SQL Server 2000版本中,这种task每个步骤中都会有大量的ActiveX Script,必须使用VBScript程序判断文件是否准备好,还需要使用VBScript判...
nd 阅读(1814) |
摘要: 数据流任务
如果你对SQL Server 2000 DTS比较熟悉,对这种数据流任务不会有了解,因为同其他任务比较它是一种很特殊的任务。主要说明数据怎样写入系统。SQL Server 2005中最大的改进是不必要创建一个存储表来接收数据,所有这些都将在内存中进行。
执行数据流任务
数据流任务会执行一个Windows或者控制台应用程序,自从SQL Server 2000之后这个任务得到很大的改...
nd 阅读(1233) |
摘要: 现在执行一个简单的bulk insert任务来练习刚才讨论的话题。首先创建一个名字为的SSIS项目。将Package.dtsx重新命名为BulkLoadZip.dtsx,如果弹出对话框提示是否重命名选择是。  首先新建文件夹C:\SSISDemos,将文件(/Files/tylerdonet/ZipCode.txt)放入这个文件夹内。然后在本地新建数据库,名字使用微软常用数据库的名字Adventu...
nd 阅读(1226) |
摘要: 执行一个任务将会执行一个或一系列的SQL语句或存储过程。在SSIS中还支持执行文件中的script。大多数的配置在下图(图3-1)中呈现。停止时间Timeout选项设置任务开始执行到停止的时间。如果设置为0以为这它将在极短的时间内执行完。图3-1 ResultSet选项设置task的输出格式。默认的设置是none。当你想把输出结果填充到一个表中的行,结果集,xml中式这个选项会很有用 。如果这个设...
nd 阅读(2278) |
摘要: 今天讲学习一下SSIS包中通用的属性,这部分没有实际操作的部分,只是一些简单的介绍。无论使用包中的何种task,都有一些通用的属性,在这里列举:  • Disable:设置这个属性为true使该task不能执行  • DelayValidation:设置为true只至运行时才验证task中的属性,在非连接状态下和为task输入一个外部参数值但是直到部署时才验证这种情况下会很...
nd 阅读(2357) |
摘要: QUOTDE_IDENTIFIER
nd 阅读(5444) |
摘要: /gaoyuchuanIT/articles/1398504.html网上搜罗的后台添加CSS和JavaScript引用,第一种方法:在母版页的cs文件中添加引用 this.Page.ClientScript.RegisterClientScriptInclude("testInclude", this.Context.Response.ApplyApp...
nd 阅读(1023) |
摘要: SQLServer安装程序配置服务器失败.参考服务器错误日志和c:\windows\sqlstp.log了解更多信息”错误日 星期日 16:25SQL 2000 安装程序配置服务器失败解决方法:日志文件引用内容:13:09:40 Process Exit Code: (-1)13:10:45 安装程序配置服务器失败。参考服务器错误日志和 C:\WINDOWS\sql...
nd 阅读(323) |
摘要: 估计初学Oracle的朋友没少折腾过,在Windows中安装配置Oracle。有时候因某种原因,Oracle9i不能正常运行了,而你打算要重新安装Oracle9i,当你到控制面板下面删除oracle9i后,这样之后开始重新安装Oracle9i,但是当你安装到一半后,系统提示安装错误了,找了老半天也找不出什么原因出来。你可以选择重新安装Windows操作系统,等操作系统安装完成后,再安装Oracle...
nd 阅读(10307) |
摘要: 转自:/skywind/archive//798547.htmlDataFormatString格式字符串 DataFormatString="{0:格式字符串}" 在DataFormatString 中的 {0} 表示数据本身,而在冒号后面的格式字符串代表所们希望数据显示的格式; 数字、货币格式:在指定的格式符号后可以指定小数所要显...
nd 阅读(166) |
摘要: Request.QueryString出现乱码问题
nd 阅读(226) |
摘要: 8:13:49 一直想整理出这几个问题但是找不出时间来,今天周末静下心来写点东西。 最近做的项目中出现了Oracle数据库访问,客户要求程序最终发布在Server 2008(64位SP2)中,先前的SQL Server数据库也安装在这台Server 2008中,于是也想把Oracle数据库安装在这台服务器上,安装普通的Oracle 9i数据库版本是Oracle(R) Enterprise Mana...
nd 阅读(1635) |
作者:Tyler Ning
出处:/tylerdonet
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

我要回帖

更多关于 ssis lookup 的文章

 

随机推荐