这是我正在使用的sql 2000数据库.
我有一个我称之为临时表的数据原始数据转储,所以一切都是ntext或nvarchar(255).
我需要将所有这些数据转换/转换为适当的数据类型(即int,decimal,nvarchar等)
我要这样做的方法是使用while循环迭代所有记录,并在每次迭代期间在单个记录上的每一列上尝试CAST,在我访问特定记录后,我将其标记为已处理(位字段).
但是,如果/如果它发生但如何允许while循环继续,我该如何记录错误.
起初我在本地SQL 2005实例中使用TRY CATCH实现了这个(为了让项目继续进行)并且一切运行良好,但我今天了解到国际DBA设置的开发和生产数据库是SQL 2000实例所以我必须遵守.
编辑:我正在使用SSIS包来填充登台表.我看到现在我必须重新访问该包并实现一个脚本组件来处理转换.多谢你们
编辑:我在记录的基础上这样做,而不是批量插入,所以交易的想法似乎是可行的但我不知道如何陷阱@@ ERROR并允许存储过程继续.
编辑:我真的很喜欢Guy的方法,我将以这种方式实现它.
一般来说,我不喜欢“循环记录”解决方案,因为它们往往很慢,并且您最终会编写大量自定义代码。
所以...
根据登台表中的记录数量,您可以使用一系列 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...
Run Code Online (Sandbox Code Playgroud)
最后
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;
Run Code Online (Sandbox Code Playgroud)
临时表包含所有错误,您可以导出并报告这些错误。