SQL 2000'TRY CATCH like'错误处理

时间:2020-03-05 18:44:45  来源:igfitidea点击:

这是我正在使用的sql 2000数据库。

我有一个所谓的登台表,它是数据的原始数据转储,因此所有内容都是ntext或者nvarchar(255)。

我需要将所有这些数据转换/转换为适当的数据类型(即,int,十进制,nvarchar等)

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

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

最初,我在本地SQL 2005实例中使用TRY CATCH来实现此目的(以使项目继续进行),并且一切运行良好,但是今天我了解到,国际DBA建立的dev&production数据库是SQL 2000实例。所以我必须遵守。

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

编辑:我是在逐条记录的基础上执行此操作,而不是批量插入,因此事务处理方法似乎可行,但我不确定如何捕获@@ ERROR并允许存储过程继续进行。

编辑:我真的很喜欢盖伊的方法,我将以这种方式实现它。

解决方案

回答

我们正在使用什么导入文件? DTS具有可用于数据验证的脚本编制功能。如果不使用DTS,是否使用自定义工具?如果是这样,请在那里进行验证。

但是,我认为这是我们想要的。
http://www.sqlteam.com/article/using-dts-to-automate-a-data-import-process

IF @@Error <> 0
 GOTO LABEL

@op
在SSIS中,数据导入任务中的"红线"可以将不良行重定向到单独的目标或者进行转换。我有一段时间没有玩了,但希望对我们有所帮助。

回答

看来我们注定要失败。请参阅此文件。

TL / DR:数据转换错误始终会导致整个批处理被中止,无论我们执行什么操作,sql脚本都不会继续执行。交易将无济于事。我们无法检查@@ ERROR,因为执行将已经中止。

我首先要重新检查一下,为什么我们需要一个装满varchar(255)列的登台数据库,而无论该数据库填充了什么数据库,都可以进行转换?

如果没有,我想我们需要编写一个程序/脚本以从varchar列中进行选择,转换并插入到prod db中。

回答

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

回答

我们可以尝试在转换之前检查数据类型,并实际上避免引发错误。

我们可以使用以下功能:

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

回答

通常,我不喜欢"遍历记录"解决方案,因为它们往往很慢,而且我们最终编写了许多自定义代码。

所以...

根据登台表中有多少条记录,我们可以使用一系列SQL语句对数据进行后期处理,这些SQL语句测试列的正确性并标记任何未通过测试的记录。

IE。

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;

登台表具有所有错误,我们可以导出和报告错误。