SQL通过映射表插入

时间:2018-12-04 12:05:07

标签: sql sql-server ssis

作为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中的值循环遍历每个登台表并插入到真实表\列中?

是否可以通过游标和循环来实现?

任何帮助将不胜感激。

2 个答案:

答案 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查询生成的逗号分隔值。只需确保以相同顺序填充两个“列”变量即可。