基于源excel文件名和行集动态创建表

时间:2016-02-08 10:21:18

标签: sql sql-server ssis

我有文件夹,其中包含几个excel文件,所有文件都包含相同的结构。现在我需要将每个excel文件的这些excel数据加载到不同的表中,并且需要使用源excel文件名和excel的相同模式动态创建表。

类似文件A需要加载到文件表中,文件B需要加载到文件b表,并且还需要通过ssis包动态创建表,如果加载数据时一个文件中有任何错误它不应该停在那里,需要通过将错误文件保留在文件夹中来转到下一个文件。

请帮帮我......

1 个答案:

答案 0 :(得分:1)

完全同意@ThorstenKettner。如果可能的话,将所有条目加载到一个表中,并附加一列来捕获源文件名。这将更容易构建,管理,并且至关重要的是,使用。

如果出于某种原因,您必须将每个文件分成自己的表:

  1. 使用 For Each Loop Container ,将源文件夹中的文件名读取到SSIS变量中。
  2. 在循环内;使用filename变量创建表,方法是将其作为参数传递给执行SQL任务
  3. 使用数据流任务导入文件。数据流中的源和目标连接必须使用您的filename变量来设置源文件和目标表。
  4. 第2步可能是最难的部分。一个非常粗略的陈述看起来有点像这样:

    /* @FileName is passed as a parameter.
     * @CreateTable is a template statement.
     */
    DECLARE @FileName       NVARCHAR(255)   = ?
    DECLARE @CreateTable    NVARCHAR(255)   = 
        '
            CREATE TABLE <Replace/> 
                (
                    ID      INT IDENTITY(1, 1)  PRIMARY KEY,
                    Field1  NVARCHAR(255)       NOT NULL
                );
        ';
    
    
    /* Update @CreateTable with the current table name.
     */
    SET @CreateTable = REPLACE(@CreateTable, '<Replace/>', @FileName);
    
    /* Create the new table.
     */
    EXEC (@CreateTable);
    

    进一步行动

    这只是一个非常粗略的概述。每个步骤都需要进一步研究。如果您对SSIS变量和表达式不满意,则应首先研究它们(从Microsoft's Developer Network开始)。至少,您需要知道如何使用变量来更新连接的属性。

    您还需要考虑如何处理已导入的文件。