Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从固定宽度平面文件到SQL 2000获取数百万条记录_C#_Sql Server - Fatal编程技术网

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

C# 从固定宽度平面文件到SQL 2000获取数百万条记录,c#,sql-server,C#,Sql Server,显然,我可以使用BCP,但问题是。如果批处理中有一条记录的日期无效,我想将其重定向到一个单独的表/文件/任何文件,但要保持批处理运行。我不认为SSI可以安装在服务器上,这会有所帮助。创建一个在插入时处理的触发器。此触发器将对日期字段进行验证检查。如果验证失败,则在单独的表中插入,您还可以选择继续插入或不允许插入 重要提示:默认情况下,触发器不会在批量插入时触发(包括BCP和SSI)。要使其正常工作,您需要使用以下命令指定要触发触发器: BULK INSERT your_database.your

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

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

重要提示:默认情况下,触发器不会在批量插入时触发(包括BCP和SSI)。要使其正常工作,您需要使用以下命令指定要触发触发器:

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

你是说文件中有一列充满了日期,你想让这些数据进入SQL数据库表中“datetime”类型的列吗?如果文件中的一个值不是有效日期,它就会爆炸?我只是想确保我理解正确

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

然后,在SQL中,您可以根据需要对数据进行按摩。您可以使用从临时表中选择所有记录并循环它们。对于每个记录,可以使用T-SQL函数有条件地将当前记录中的值插入到一个表或另一个表中

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

// **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
//**这未经测试,可能存在语法错误**
//如果我们有这样的表格:
创建表tempoary(id VARCHAR(255)、date VARCHAR(255)、somethingElse VARCHAR(255))
创建表theGood(id INT,date DATETIME,somethingElse VARCHAR(255))
创建表theBad(id INT,theDate VARCHAR(255))
//然后在将数据输入[tempoary]后,执行以下操作:
声明临时游标游标
对于SELECT id,日期,从临时
打开临时光标
声明@id VARCHAR(255)
声明@theDate VARCHAR(255)
声明@somethingElse VARCHAR(255)
从tempCursor获取下一个到@id、@theDate、@somethingElse
While(@@FETCH\u状态-1)
开始
如果ISDATE(@theDate)
开始
插入货物(id、日期等)
值(CONVERT(INT,@id),CONVERT(DATETIME,theDate),somethingels)
终止
其他的
开始
插入BAD(id,日期)
值(转换(INT,@id),日期)
终止
从tempCursor获取下一个到@id、@theDate、@somethingElse
终止
关闭临时光标
释放临时游标

是的,如果您使用的是DTS,您应该只导入到使用varchar而不是日期的暂存表中,然后在字尾后将数据传递到适当的表中。

Matt所说的问题是,您不应该在事后使用光标来处理数据,尤其是在您有数百万条记录的情况下。Cursopr效率极低,应避免使用

改用批处理


但无论如何都要使用他的临时桌子的想法。我不会考虑直接导入到一个生产表中,因为太多的事情会随着时间的推移而改变输入文件中的数据并引起问题。

我喜欢你的想法,听起来比我的更简单。我想我明白你在说什么。使用光标会很慢,特别是对于问题中所述的数百万条记录,而且还因为这似乎是需要常规发生的事情,而不仅仅是一次。