2008-09-21 42 views

回答

5

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

重要注:默认情况下,触发器不上批量插入火(BCP & SSIS包括在内)。为了得到这个工作,你需要指定要触发火灾,使用类似:

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

我喜欢你的想法,它听起来更简单。 – 2008-09-21 06:17:47

0

你是说有一个完整的文件中的日期栏,和你想要的数据在SQL数据库的表中进入“datetime”类型的列?如果文件中的某个值不是有效的日期,它会炸毁吗?我只是想确保我理解这个权利。

您可以在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 
3

呀,如果你正在使用DTS,你应该只导入使用VARCHAR而不是一个临时表日期,然后将数据按顺序按摩到适当的表格中。

3

马特说的问题是你不应该使用游标操作数据,特别是如果你有数百万条记录。 CUrsoprs效率非常低,应该避免。

改为使用批处理。

但通过一切手段使用他的临时表的想法。我不会考虑直接导入到生产表中,因为随着时间的推移,可能会发生太多事情来更改输入文件中的数据并导致问题。

+0

我想我明白你在说什么了。使用游标会很慢,尤其是在问题中提到的数百万条记录的情况下,还因为这似乎是需要常规而不是一次性发生的事情。 – 2008-09-21 21:32:13

相关问题