这是我正在使用的 sql 2000 数据库。
我有一个所谓的临时表,它是数据的原始数据转储,因此一切都是 ntext 或 nvarchar(255)。
我需要将所有这些数据转换/转换为适当的数据类型(即 int、decimal、nvarchar 等)
我要执行此操作的方法是使用 while 循环迭代所有记录,并在每次迭代期间尝试对单个记录的每一列进行 CAST,在访问特定记录后,我将其标记为已处理(位字段) )。
但是当/如果发生错误时我如何记录错误但允许 while 循环继续。
起初,我在本地 SQL 2005 实例中使用 TRY CATCH 实现了这一点(以使项目顺利进行),一切都运行良好,但今天我了解到国际 DBA 建立的开发和生产数据库是一个SQL 2000 实例,所以我必须遵守。
编辑:我正在使用 SSIS 包来填充临时表。我发现现在我必须重新访问该包并实现一个脚本组件来处理转换。谢谢大家
编辑:我正在逐条记录地执行此操作,而不是批量插入,因此事务想法似乎是可行的,但我不是确定如何捕获@@ERROR并允许存储过程继续。
编辑:我真的很喜欢Guy's approach ,我打算这样实现。
最佳答案
一般来说,我不喜欢“循环记录”解决方案,因为它们往往很慢,而且您最终会编写大量自定义代码。
所以...
根据登台表中有多少记录,您可以使用一系列 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;
临时表包含所有错误,您可以导出并报告这些错误。
关于sql-server - SQL 2000 'TRY CATCH like' 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33685/