这是我正在使用的sql 2000数据库。
我所谓的临时表是数据的原始数据转储,所以一切都是ntext或nvarchar(255)。
我需要将所有这些数据转换/转换为适当的数据类型(即int,decimal,nvarchar等)。
我要这样做的方法是使用while循环迭代所有记录,并在每次迭代期间在单个记录上的每一列上尝试CAST,在我访问特定记录后,我将其标记为已处理(位字段) )。
但是如何在/如果发生错误时记录错误但允许while循环继续。
起初我在本地SQL 2005实例中使用TRY CATCH实现了这个(为了让项目继续进行)并且一切运行良好,但我今天才知道开发和创建国际DBA设置的生产数据库是一个SQL 2000实例,所以我必须遵守。
编辑:我正在使用SSIS包填充登台表。我看到现在我必须重新访问该包并实现一个脚本组件来处理转换。谢谢你们
编辑:我是按记录进行此操作,而非批量插入,因此交易想法似乎是可行的,但我不是确定如何捕获@@ ERROR并允许存储过程继续。
编辑:我非常喜欢Guy's approach,我将以这种方式实施。
答案 0 :(得分:2)
你用什么来导入文件? DTS具有可用于数据验证的脚本功能。如果您不使用DTS,您是否使用自定义工具?如果是,那么你的验证就在那里。
但我认为这就是你要找的东西 http://www.sqlteam.com/article/using-dts-to-automate-a-data-import-process
IF @@Error <> 0
GOTO LABEL
@op
在SSIS中,来自数据导入任务的“红线”可以将坏行重定向到单独的目标或转换。我有一段时间没玩过它,但希望它有所帮助。
答案 1 :(得分: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 :(得分:1)
看起来你注定要失败。请参阅this文档。
TL / DR:数据转换错误总是导致整个批处理中止 - 无论你做什么,你的sql脚本都不会继续执行。交易无济于事。您无法检查@@ ERROR,因为执行已经中止。
我首先要重新检查为什么你需要一个充满varchar(255)列的登台数据库 - 这个数据库可以进行转换的任何填充吗?
如果没有,我想你需要编写一个程序/脚本来从varchar列中进行选择,转换并插入到prod db中。
答案 3 :(得分:1)
在事务中运行每个演员,在每次演员之后,检查@@ ERROR,如果它清除,提交并继续。
答案 4 :(得分:1)
您可以在投射前尝试检查数据类型,实际上避免抛出错误。
您可以使用以下功能:
ISNUM - to check if the data is of a numeric type ISDATE - to check if it can be cast to DATETIME