2012-05-08 14 views
0

1つのテーブルから同じ「アーカイブ」テーブルに1歳の行を移動するクエリがあります。削除クエリから不良行をブロックするには

無効な日付がdateprocessed列(行が1年以上経過しているかどうかを評価するために使用される)に入力され、クエリのエラーが出力されることがあります。私は本質的に、悪い行を「スクリーニング」したい、つまりwhere not isdate(dateprocessed)が1と等しくないようにして、クエリがそれらをアーカイブしようとしないようにする。

私はこれを行う方法についていくつかのアイデアを持っていますが、可能な限り単純な方法でこれをしたいと考えています。私がストアドプロシージャ内の一時テーブルに良いデータを選択した場合、内部テーブルとライブテーブルを結合し、ライブ出力からアーカイブを削除して実行します - それは基礎となるライブテーブルまたは新しい結合テーブルから削除されますか?

これを行うより良い方法はありますか?助けてくれてありがとう。私は.NETプログラマでDBAを使っていますが、これを正しく実行したいと考えています。

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) 
+5

なぜあなたのデザインを修正せずにdatetimeフィールドを使用すると、datetimeフィールドに無効な日付が格納されていないのでしょうか。 – HLGEM

+0

4つのステップが必要です:コピー、処理、アーカイブ、削除 –

答えて

0

行うための最も簡単なものは次のとおりです:

  • 一時テーブル
  • に正しいレコードを選択します。ここ

    はエラーがdateprocessed列の値の一部が無効であるとき、クエリがあります

  • 一時表にコピーする必要があるフィールドの1つは、「ID」列のような 一意のIDである必要があります。
  • 一時表の追加処理を実行します
  • 一時表からアーカイブ表へのアーカイブ
  • 「ID」列を使用して一時表との結合でライブ表から削除します。これにより、間違いがないことが保証されます。
0

あなたが.NETの人なら、すべてのデータを取得してDateTime.TryParseを実行できます。実際のDateTime列に値を設定するには、一度やり直してください。あなたを解析しない日付は、固定の日付またはnullを割り当てることができます。そして、.NETが解析するいくつかの日付文字列があります(例えば、2010年11月)。

関連する問題