0

我共有 60 个 .txt 文件,我正在尝试处理并使用 SSIS 包生成 1 个输出平面文件。那些 60 .txt 文件被加载到表中。

现在输出文件会太大。所以我试图把这个文件分成 6 个块。所以当我的 ssis 包运行时,10 个文件将处理并创建 1 个

输出文件并再次运行 ssis 包并生成另一个文件。总共将是 6 个文件。

我有 SQL 任务,它在 SSIS 包中获取那些不同的文件名,然后进行处理。有一个列名JobDone,我将其视为标志。

SELECT DISTINCT FileName FROM Table A WHERE JobDone IS NULL

我已将表 A 中的列名声明为 => Bit null,因此 SSIS 包会选取所有JobDone值为NULL

通过上面的 SQL 语句,它将获取所有这 60 个文件。现在我想一次只提取 10 个文件。我想用这 50 个文件更新一个没有例如 7 的标志,所以当我的 SSIS 包运行时,它只需要 10 个文件。

一旦在 SSIS 中完成了 10 个文件的处理,想要将这 50 个文件中的 10 个文件的标志更新JobDoneNULL,这 10 个文件将运行,现在剩下 40 个。然后我想再更新NULL10 个文件的标志并运行 SSIS pacakge。直到所有文件正在处理并生成 6 个输出文件。

任何帮助将不胜感激。提前致谢。

4

1 回答 1

3

如果我必须按照您的要求做,我的包裹看起来像这样(减去第一步)

在下面创建 2 个名为和对象类型的变量

  • 文件名字符串
  • 表列表对象

CF

数据流如下所示。一般来说,我讨厌在数据流中聚合,但在这里它是有道理的。将您的数据写入文件,并找出您使用的 10 个文件名。将这些名称写入内存记录集对象 (TableList)。

数据流

使用 Recordset 对象并将其切碎(将 Jamie Thomson 的帖子合并为详细信息),这将帮助您将行从 RS 对象中提取出来。在 ForEach 循环中,您将执行一条 UPDATE 语句以将这些文件标记为已处理。

我使用以下脚本创建了一些数据

IF NOT EXISTS
(
    SELECT * 
    FROM sys.tables AS T 
    WHERE T.name = 'Chunks' AND T.schema_id = SCHEMA_ID('dbo')
)
BEGIN
    -- Source table
    CREATE TABLE
        dbo.Chunks
    (
        SourceFile varchar(50) NOT NULL
    ,   JobDone bit NULL
    ,   FileData varchar(500) NOT NULL
    );

    -- add some data
    WITH SRC AS
    (
        SELECT
            OBJECT_NAME(AC.object_id) AS SourceFile
        ,   NULL AS bit
        ,   AC.name AS FileData
        FROM
            sys.all_columns AS AC
    )
    , TOP60 AS
    (
        SELECT TOP 60
            SRC.SourceFile
        ,   COUNT(1) AS rc
        FROM
            SRC
        GROUP BY
            SRC.SourceFile
        ORDER BY
            2 DESC
    )
    INSERT INTO
        dbo.Chunks
    (
        SourceFile
    ,   JobDone
    ,   FileData
    )
    SELECT 
        SRC.SourceFile
    ,   SRC.bit
    ,   SRC.FileData
    FROM 
        TOP60 T
        INNER JOIN
            SRC    
            ON SRC.SourceFile = T.SourceFile;
END

我的 OLEDB 源看起来像以下查询

-- grab all the data associated to them
SELECT
    C.SourceFile
,   C.JobDone
,   C.FileData
FROM
    dbo.Chunks AS C
WHERE
    C.SourceFile IN
    (
        -- Grab any 10 sourcefile names that haven't been processed
        SELECT TOP 10
            C.SourceFile
        FROM
            dbo.Chunks AS C
        WHERE
            C.JobDone IS NULL
    )  
ORDER BY
    C.SourceFile;

我的更新声明看起来像

UPDATE
    C
SET
    JobDone = 1
FROM
    dbo.Chunks AS C
WHERE
    C.JobDone IS NULL
    AND C.FileName = ?;
于 2013-06-21T22:26:38.990 回答