etl过程过,往一个数据库表插入数据,插入的值往往需要到另外一个数据库读取。例如下面的客户跟踪,需要一个“项目ID”,这个ID需要到另一个数据库的一张表查找,找到后返回给“客户跟踪”任务流。
执行SQL任务“原项目ID”的配置如下图:
sql语句是:if exists(SELECT * FROM dbo.TB_BBProject WHERE (PJ_Name = @PJ_Name))
SELECT top 1 PJ_ID FROM dbo.TB_BBProject WHERE (PJ_Name = @PJ_Name);else select –1如果直接写:SELECT top 1 PJ_ID FROM dbo.TB_BBProject WHERE (PJ_Name = @PJ_Name),当这个查询没有数据返回的时候,ssis就会报道如下错误: 无法为单行结果类型填充结果列。查询返回了一个空的结果集这是因为“结果集”设置成单行,ssis就要求必须返回一行,不允许空行。
保存结果的变量“原项目ID”的数据类型需要设置成“Object”,在其他地方使用的时候,ssis会自动转成int类型,见下图:在“OLE DB 源数据源”中使用“原项目ID” “OLE DB 源”需要的查询参数需要使用“select * from tableName where fieldName=?”,只有ADO NET源才可以使用@参数名但是感到奇怪的是“ADO NET 源”(如下图)查询居然不可以设置查询参数: