如何阻止删除查询中的错误行

时间:2012-05-08 17:27:21

标签: sql tsql stored-procedures

我有一个查询将一年之久的行从一个表移动到相同的“存档”表。

有时,无效日期会输入到dateprocessed列(用于评估行是否超过一年),并且查询错误输出。我想基本上“屏蔽”坏行 - 即where not isdate(dateprocessed)不等于1 - 以便查询不会尝试存档它们。

我对如何做到这一点有一些想法,但希望以绝对最简单的方式做到这一点。如果我在我的存储过程中将好数据选择到临时表中,然后将其与实时表连接,然后从实时输出中运行删除到存档 - 它将从基础活动表或新连接表中删除吗?

有更好的方法吗?谢谢您的帮助。我是一名扮演DBA的.NET程序员,但我真的很想做到这一点。

以下是某些dateprocessed列值无效时出现错误的查询:

delete from live 
output deleted.* into archive 
where isdate(dateprocessed) = 1 
  and cast (dateprocessed as datetime) < dateadd(year, -1, getdate()) 
  and not exists (select * from archive where live.id = archive.id)

2 个答案:

答案 0 :(得分:0)

最简单的事情是:

  • 在临时表中选择正确的记录
  • 您需要复制到临时表中的一个字段应该是a 唯一标识符,如“ID”列
  • 在临时表中进行任何其他处理
  • 从临时表归档到归档表
  • 使用“ID”列从带有临时表的连接中删除活动表。这样可以确保不会出错。

答案 1 :(得分:0)

如果您是.NET用户,可以将每个数据都关闭并执行DateTime.TryParse。更好的是,只需执行一次即可填充实际的DateTime列。不解析您的日期可以指定固定日期或null。并且有一些日期字符串,.NET将解析SQL不会(例如,2010年11月)。