作为SSIS ETL过程的一部分,我有多个临时表。我使用xxxx只是为了类似于数据:
例如
tblStage1
Field_ABC Field_ZXC Field_QWE
xxxx xxxxxxxxx xxxxx
tblStage2
Field_PLM Field_WER Field_YTE
xxxxx xxxxxx xxxxxxx
然后我有了需要插入的“真实”表:
tblDest1
FldABC FldZXC FldQWE
tblDest2
FldPLM FldWER FldYTE
使用信息架构中的信息,我已经构建了一个映射表,该映射表详细说明了登台表中的哪个表和字段映射到了哪个实际表:
tblMapping:
StageTble StageColumn RealTable RealCol OrdinalPosition
tblStage1 Field_ABC tblDest1 FldABC 1
tblStage1 Field_ZXC tblDest1 FldZXC 2
tblStage1 Field_QWE tblDest1 FldQWE 3
tblStage2 Field_PLM tblDest2 FldPLM 1
tblStage2 Field_WER tblDest2 FldWER 2
tblStage2 Field_YTE tblDest2 FldYTE 3
如何根据tblMapping中的值循环遍历每个登台表并插入到真实表\列中?
是否可以通过游标和循环来实现?
任何帮助将不胜感激。
答案 0 :(得分:0)
我认为没有一种方法可以自动存档所需的内容,对源连接中的列进行别名以匹配目标表的列可能只是解决问题的方法。
将tblStage1转换为tblDest1的示例:
SELECT Field_ABC AS FldABC, Field_ZXC AS FldZXC, Field_QWE AS FldQWE FROM tblStage1
这样,将通过匹配名称自动映射列。
答案 1 :(得分:0)
是的,有可能。不过,这将需要很多代码,而我不会为您编写代码。但是,我会为您指出可行的解决方案的方向。
您将在映射表的SELECT DISTINCT StageTble
上创建一个游标。因此,在您的示例数据中,CURSOR将仅遍历两行。
然后,对于循环的每个迭代(每个阶段表都为ergo),您将为循环中的当前阶段表生成动态INSERT..SELECT语句。该语句将如下所示:
'INSERT INTO '+@RealTable+' ('+@RealColumns+')
SELECT '+@StageColumns+' FROM '@StageTable+';'
在该语句之前,您将通过从映射表中选择与当前舞台表相关的所有行来填充变量。两个“表”变量只是表名称,两个“列”变量是用STUFF..FOR XML
查询生成的逗号分隔值。只需确保以相同顺序填充两个“列”变量即可。