SQL遍历表名并插入表

时间:2018-12-03 15:24:26

标签: sql-server ssis

作为SSIS软件包的一部分,我有一个SQL表,其中包含登台表名称和相应的“真实”表名称。临时表的名称将根据日期而变化,但是需要执行上一步来确定Real_Table是什么。

我该如何遍历SQL中的每个变量,并将暂存表中的所有数据(两个列都相同)插入真实表中,并将标志从0更新为1,以标记完成。这是我的桌子:

Staging_Table            Real_Table     UpdateFlag
Customers_01012018       Customers      0
Order_01012018           Order          0
Suppliers_02022018       Suppliers      0

2 个答案:

答案 0 :(得分:0)

您可以使用while循环将数据加载到Real表中,

DECLARE @total INT
DECLARE @start INT
DECLARE @query NVARCHAR(MAX)
DECLARE @staging_table NVARCHAR(MAX)
DECLARE @real_table NVARCHAR(MAX)

SET @start = 1
SET @total = (SELECT COUNT(*) FROM Stg_tables)

WHILE(@start <= @total)
BEGIN

    SELECT TOP 1 @staging_table = Staging_Table, @real_table = Real_Table FROM Stg_tables WHERE UpdateFlag = 0
    SET @query = 'INSERT INTO ' + @real_table + ' SELECT * FROM ' + @staging_table

    EXEC(@query)

    UPDATE Stg_tables SET UpdateFlag = 1 WHERE Staging_Table = @staging_table AND Real_Table = @real_table

    SET @start = @start + 1
END

答案 1 :(得分:0)

有关如何执行此操作的概述如下。当然,请确保将正确的配置与您的环境相匹配,并在适用的情况下适当地设置元数据。

  • 创建一个执行SQL任务,以选择登台表和实际表 名称。选择“完整结果集” ResultSet。在结果集上 页面上,添加一个对象变量并将结果名称设置为0以使用 即时结果。
  • 添加Foreach Loop类型的Foreach ADO Enumerator。使用“执行SQL任务”中的对象变量作为ADO对象源变量。在“变量映射”页面上,在索引1和0处添加一个字符串变量。其中一个将保留登台表名称,另一个将保留实际表名称。这些将与它们在“执行SQL任务”中选择的顺序保持一致,因此,如果您首先选择了登台表,请使用一个变量,该变量的名称将保留在索引0处。
  • 创建另一个字符串变量,该字符串变量包含一个表达式,该表达式选择将从暂存表中加载的必需列,并将包含此表名的变量串联在in内。下面的示例中,@[User::StagingTableVariable]变量代表该变量持有登台表名称。
  • 在Foreach循环中,添加数据流任务,然后在其中添加一个OLE DB源。这将在从登台表中选择SQL时使用变量,但是要正确设置元数据,请选择“ SQL命令”选项,并使用从现有登台表名称中选择相同列的SQL语句。设置好之后,将ValidateExternalMetadata属性更改为false,为“数据访问模式”选择“来自变量的SQL命令”,然后选择包含使用登台表名称的SQL语句的变量。
  • 添加一个OLE DB目标并将源连接到该目标。像以前一样,使用现有的实表并映射列。此后,再次将ValidateExternalMetadata设置为false,将数据访问模式更改为使用变量中的表或视图名称(我建议使用快速加载选项),然后添加包含真实表名的变量。
  • 在“数据流任务”之后,添加另一个链接到DFT的“执行SQL任务”。使用表名称源自的映射表的update语句创建一个字符串变量。将SQLSourceType的值设置为变量,然后为SourceVariable属性选择此变量。如果您在update语句的WHERE子句中使用文本列,请确保该表达式包含单引号('),就像典型的SQL update语句一样。

示例OLE DB源变量表达式:

"SELECT ColA, ColB, ColC from YourSchema."  +  @[User::StagingTableVariable]

变量表达式更新命令示例:

"UPDATE YourSchema.MappingTable SET UpdateFlag = 1 where Real_Table = '" +  @[User::RealTableVariable] + "'"