2008-08-28 109 views
5

这是我正在使用的sql 2000数据库。SQL 2000'TRY CATCH like'错误处理

我有我称之为数据原始数据转储的临时表,所以一切都是ntext或nvarchar(255)。

我需要强制转换/转换所有的数据到相应的数据类型(即INT,小数,NVARCHAR等)

我要做到这一点的方法是通过迭代使用的所有记录while循环并在每次迭代期间在单个记录上的每列上尝试CAST,在访问特定记录之后,我将其标记为已处理(位字段)。

但是,如何在发生/如果发生错误时记录错误,但允许while循环继续。

起初,我在本地SQL 2005实例中使用TRY CATCH实现了此目的,并且所有工作都很顺利,但今天我了解到国际DBA设置的dev &生产数据库是一个SQL 2000实例,所以我必须遵守。

编辑:我正在使用SSIS包来填充登台表。我看到现在我必须重新访问该包并实施脚本组件来处理转换。谢谢你们

编辑:我上午这样一条记录被记录的基础,而不是批量插入,所以交易的想法似乎将是可行的,但我不知道如何捕获@@ ERROR并允许存储过程继续。

编辑:我真的很喜欢Guy's approach,我打算用这种方式实现它。

回答

2

一般来说,我不喜欢的解决方案“通过备案循环”,因为他们往往是缓慢的,你最终编写大量的自定义代码。

所以......

根据多条记录如何在你的临时表,你可以用一系列测试列正确性和标记测试失败的任何记录的SQL语句的后期处理数据。

UPDATE staging_table 
SET status_code = 'FAIL_TEST_1' 
WHERE status_code IS NULL 
AND ISDATE(ntext_column1) = 0; 

UPDATE staging_table 
SET status_code = 'FAIL_TEST_2' 
WHERE status_code IS NULL 
AND ISNUMERIC(ntext_column2) = 0; 

etc... 

最后

INSERT INTO results_table (mydate, myprice) 
SELECT ntext_column1 AS mydate, ntext_column2 AS myprice 
FROM staging_table 
WHERE status_code IS NULL; 

DELETE FROM staging_table 
WHERE status_code IS NULL; 

和分级表有所有的错误,你可以导出和报表输出。

2

你用什么来导入文件? DTS具有可用于数据验证的脚本功能。如果您不使用DTS,您是否使用自定义工具?如果是的话,那你在那里做验证

但我认为这是你的期望。
http://www.sqlteam.com/article/using-dts-to-automate-a-data-import-process

IF @@Error <> 0 
GOTO LABEL 

@op
在SSIS中的“红线”从数据导入任务可以坏行重定向到一个单独的目的地或变换。我有一段时间没有玩过它,但希望它有帮助。

1

看起来你注定了。见this文件。

TL/DR:数据转换错误总是导致整个批处理被中止 - 不管你做什么,你的sql脚本都不会继续执行。交易无济于事。您不能检查@@ ERROR,因为执行已经中止。

我会首先重新检查为什么你需要一个临时数据库完整的varchar(255)列 - 可以填充数据库做任何转换吗?

如果不是,我想你需要编写一个程序/脚本来从varchar列中进行选择,转换并插入到prod数据库中。

1

在事务中运行每个强制转换,每次强制转换后,检查@@ ERROR,如果清除,提交并继续。

1

您可以尝试在投射前检查数据类型并实际避免投掷错误。

您可以使用类似功能:

 
ISNUM - to check if the data is of a numeric type 
ISDATE - to check if it can be cast to DATETIME