从固定宽度的平面文件获取数百万条记录到 SQL 2000

Posted

技术标签:

【中文标题】从固定宽度的平面文件获取数百万条记录到 SQL 2000【英文标题】:Get millions of records from fixed-width flat file to SQL 2000 【发布时间】:2010-09-11 17:44:25 【问题描述】:

显然我可以使用 BCP,但这是问题所在。如果批处理中的一条记录的日期无效,我想将其重定向到单独的表/文件/其他任何内容,但保持批处理运行。我不认为 SSIS 可以安装在有帮助的服务器上。

【问题讨论】:

【参考方案1】:

马特所说的问题是,您不应该在事后使用游标来操作数据,尤其是在您拥有数百万条记录的情况下。 CUrsopr 效率极低,应避免使用。

改用批处理。

但无论如何都要使用他关于临时表的想法。我不会考虑直接导入生产表,因为随着时间的推移会发生太多事情来更改输入文件中的数据并导致问题。

【讨论】:

我想我明白你在说什么。使用游标会很慢,尤其是问题中所述的数百万条记录,而且这似乎是需要定期进行的事情,而不仅仅是一次。【参考方案2】:

是的,如果您使用的是 DTS,您应该只导入到使用 varchar 而不是日期的临时表中,然后将数据按摩到适当的表中。

【讨论】:

【参考方案3】:

您是说文件中有一个包含日期的列,并且您希望该数据进入 SQL 数据库表中“日期时间”类型的列?如果文件中的一个值不是有效日期,它会爆炸吗?我只是想确保我理解正确。

您可以在 SQL 数据库中创建另一个临时表,其结构与您希望文件中的数据最终所在的表具有相同的结构,但每列的类型均为 varchar(255) 或其他类型。无论任何日期是否有效,将数据从文件中提取到该表中都不会失败。

然后,在 SQL 中,您可以随意处理数据。您可以使用cursor 从临时表中选择所有记录并遍历它们。对于每条记录,您可以使用 T-SQL ISDATE 函数有条件地将当前记录中的值插入到一个或另一个表中。

我是说,将数据存入数据库,然后像这样运行脚本:

// **this is untested, there could be syntax errors**

// if we have tables like this:
CREATE TABLE tempoary (id VARCHAR(255), theDate VARCHAR(255), somethingElse VARCHAR(255))
CREATE TABLE theGood  (id INT, theDate DATETIME, somethingElse VARCHAR(255))
CREATE TABLE theBad   (id INT, theDate VARCHAR(255))

// then after getting the data into [tempoary], do this:
DECLARE tempCursor CURSOR
FOR SELECT id, theDate, somethingElse FROM temporary

OPEN tempCursor

DECLARE @id VARCHAR(255)
DECLARE @theDate VARCHAR(255)
DECLARE @somethingElse VARCHAR(255)

FETCH NEXT FROM tempCursor INTO @id, @theDate, @somethingElse
While (@@FETCH_STATUS <> -1)
BEGIN
    IF ISDATE(@theDate)
    BEGIN
        INSERT INTO theGood (id, theDate, somethingElse)
        VALUES (CONVERT(INT, @id), CONVERT(DATETIME, theDate), somethingElse)
    END
    ELSE
    BEGIN
        INSERT INTO theBad (id, theDate)
        VALUES (CONVERT(INT, @id), theDate)
    END
    FETCH NEXT FROM tempCursor INTO @id, @theDate, @somethingElse
END
CLOSE tempCursor
DEALLOCATE tempCursor

【讨论】:

【参考方案4】:

创建一个在 INSERT 上处理的触发器。此触发器将对您的日期字段进行验证检查。如果验证失败,则在单独的表中插入,您也可以选择继续插入或不允许插入。

重要注意:默认情况下,触发器不会在批量插入时触发(包括 BCP 和 SSIS)。为了让它工作,你需要指定你希望触发器触发,使用类似的东西:

BULK INSERT your_database.your_schema.your_table FROM your_file WITH (FIRE_TRIGGERS )

【讨论】:

我喜欢你的想法,听起来确实比我的简单。

以上是关于从固定宽度的平面文件获取数百万条记录到 SQL 2000的主要内容,如果未能解决你的问题,请参考以下文章

使用 hive sql 批量插入数百万条记录到 hive?

需要帮助优化涉及数百万条记录的非常慢的 DB2 SQL 查询

在 Spring Boot 中将数百万条记录从 postgresql 导出到 excel 中

删除数百万条记录 oracle [关闭]

mysql如何更快地插入数百万条记录? [关闭]

Rownum 或 Fetch/offset 适合选择和处理数百万条记录