0

1 年前の行を 1 つのテーブルから同一の「アーカイブ」テーブルに移動するクエリがあります。

無効な日付がdateprocessed列に入力され (行が 1 年以上経過しているかどうかを評価するために使用されます)、クエリでエラーが発生することがあります。クエリがそれらをアーカイブしようとしないように、本質的に悪い行を「選別」したい-つまり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)
4

2 に答える 2

0

最も簡単なことは次のとおりです。

  • 正しいレコードを選択して一時テーブルに入れる
  • 一時テーブルにコピーする必要があるフィールドの 1 つは、「ID」列のような一意の識別子である必要があります
  • 一時テーブルで追加の処理を行います
  • 一時テーブルからアーカイブ テーブルへのアーカイブ
  • 「ID」列を使用して、一時テーブルと結合してライブ テーブルから削除します。これにより、間違いが発生しないことが保証されます。
于 2012-05-08T18:24:18.623 に答える
0

あなたが .NET の人なら、すべてのデータをダウンさせて DateTime.TryParse を実行できます。さらに良いのは、実際の DateTime 列にデータを入力するために 1 回だけ実行することです。解析しない日付には、固定の日付または null を割り当てることができます。また、.NET では解析され、SQL では解析されない日付文字列がいくつかあります (.eg 2010 年 11 月)。

于 2012-05-08T18:58:49.480 に答える