Sql 使用no和set counter更新标志/列值以创建小块文件

Sql 使用no和set counter更新标志/列值以创建小块文件,sql,ssis,Sql,Ssis,我总共有60个.txt文件,我正在尝试使用SSIS包处理并生成1个输出平面文件。这些60.txt文件加载到表中 现在输出文件将太大。所以我试着把这个文件分成6的chunck。因此,当我的ssis包运行时,将处理10个文件并创建1个 输出文件,然后再次运行ssis包并生成另一个文件。总共将有6个文件 我有一个SQL任务,它在SSIS包中获取这些不同的文件名,然后进行处理。有一个列名JobDone,我将其视为一个标志 SELECT DISTINCT FileName FROM Table A WHE

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

现在输出文件将太大。所以我试着把这个文件分成6的chunck。因此,当我的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个文件。我想用一些no来更新标志,例如7 这50个文件,所以当我的SSIS包运行时,只需要10个文件

在SSIS中完成这10个文件处理后,要将
JobDone
的标志更新为
NUL
L,以便从这50个文件中再运行10个文件,这10个文件将运行,现在剩下40个。然后,我想再次将标志更新为
NULL
以获得10个以上的文件,并运行SSIS pacakge。直到所有正在处理的文件和6个输出文件生成

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

如果我必须按照你的要求去做,我的软件包会是这样的(减去第一步)

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

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

数据流如下所示。一般来说,我讨厌在数据流中进行聚合,但在这里它是有意义的。将数据写入文件,并计算出使用的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 = ?;

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

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

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

数据流如下所示。一般来说,我讨厌在数据流中进行聚合,但在这里它是有意义的。将数据写入文件,并计算出使用的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 = ?;


听起来这里发生了很多事情。您只是想讨论如何更新位字段,还是想深入研究更大的问题?只是想讨论更新表a中的其他内容文件00、文件10、文件30、文件45和文件59(假设我列出了10)是否进入输出文件还是存在某种隐式顺序(File00-File09)组成一个输出批?这些文件有多大?除了合并这些文件之外,SSIS包的作用是什么?不要紧,只需一次抓取10个文件,并将标志更新为其他文件,这样它就不会拾取这些文件。因此,运行10个文件,然后SSIS包将用“是”更新标志,以更新完成任务的那些文件-JobDone 1,然后再从这些大块文件中,我想更新列JobDone=Null的值,以便它拾取这些文件并处理它们。听起来这里有很多事情。你只是想谈谈如何更新位字段,还是想深入探讨更大的问题?只是想谈谈日期
表A中还有什么
文件00、文件10、文件30、文件45和文件59(假设我列出了10)进入输出文件还是存在某种隐式顺序(文件00-文件09)重要吗组成一个输出批?这些文件有多大?除了合并这些文件之外,SSIS包的作用是什么?不要紧,只需一次抓取10个文件,并将标志更新为其他文件,这样它就不会拾取这些文件。因此,运行10个文件,然后SSIS包将用“是”更新标志,以更新完成任务的那些文件-JobDone 1,然后再次从这些大块文件中,我想更新列JobDone=Null的值,以便它拾取这些文件并处理它们。非常感谢,这非常有用。但这一点我并没有更改SSIS包。我只需要SQL update语句。类似于设置计数器的内容。最初JobDone将为Null。对于5的其余部分0个文件,我需要将列JobDone标志更改为类似7的内容。因此,当SSIS包运行时,它不会拾取这50个文件。是否有类似于使用update语句设置计数器的内容?我回答中的最后一个语句是on,用于指示特定文件已被处理。我是否误解了您的问题?这是al准备好了吗?我正在ssis包中进行操作。处理完我的文件后,我将更新JobDone=1。您能编辑您的问题以准确定义您需要的帮助吗?我知道我很困惑。非常感谢您,这非常有用。但这一点我并没有更改ssis包。我只需要SQL update语句。我需要一些