sql-server - SQL 2000 'TRY CATCH like' 错误处理

标签 sql-server

这是我正在使用的 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/

相关文章:

sql - 选择两个 IP 范围之间的记录

c# - 如何避免同时在表上工作的两个(或更多)线程不在同一行上工作?

sql-server - 将多行默认值插入表中

sql-server - SQL Server 2008 R2 中的链接服务器

c# - 将字符串从 MSSQL 转换为 MySQL

sql-server - SQL 在主表中插入数据,然后在明细表中引用数据

sql - 如何检查当前时间是否在 SQL 中的两次之间?

sql-server - 多个语句以防 MDX

sql-server - SSIS - 如何转换 Oracle 的实际值?

重负载下SQL Server检索错误(200并发用户)