0

データベースを少しクリーンアップするためにUPDATESQLクエリを作成しようとしています...

これが私が試したことですが、それは私にとって大きな問題を引き起こし、WHEREs変更されるはずのない変更されたレコードのすべてを尊重しなくなってしまいました...

UPDATE Orders
SET Orders.OrderStatus = Cancelled
WHERE Orders.OrderStatus in (New,Pending,Processing,Payment Declined,Awaiting Payment,See Line Items,See Order Notes,Backordered)
AND Orders.Total_Payment_Received = 0

3番目の条項もありました。その句はうまく機能しませんでした。60日より古いすべてのレコードを取得するように設計されていて、機能しないように見え、なぜコードを実行したのかわかりません。私はここにその行を投稿するのが怖いので、私はばかげているように見えます。それは次のようなものでした:

AND Orders.OrderDate BETWEEN DATEADD(Day, -60, GetDate())

したがって、60日より古いOrderDateのレコードのみが影響を受けるはずです。

誰かが私がうまくいくクエリをコンパイルするのを手伝ってくれるなら、それは大いにありがたいです...

4

3 に答える 3

0

最初の更新が機能しているのかどうか、それとも注文日のチェックが問題を引き起こしているだけなのか、完全にはわかりませんので、注文日についてだけ説明します.

60日より古いレコードが必要な場合...

and Orders.OrderDate < dateadd(day, -60, getdate())

ただし、 getdate() には時間が含まれているため、それを考慮したくない場合があります...

and Orders.OrderDate < dateadd(day, -60, convert(char(10), getdate(), 101))

この場合の convert 関数は、日付の時刻部分を削除します。

また、注文ステータスが文字列であることが想定されている場合は、引用符で囲む必要があるため、完全なクエリは次のようになります。

UPDATE Orders 
SET Orders.OrderStatus = 'Cancelled'
WHERE Orders.OrderStatus in ('New','Pending','Processing','Payment Declined','Awaiting Payment','See Line Items','See Order Notes','Backordered') 
AND Orders.Total_Payment_Received = 0 
AND Orders.OrderDate < dateadd(day, -60, convert(char(10), getdate(), 101))

更新の実行に関するアドバイス。影響を受ける行を特定できるようにSELECT、常に同じ句で最初に実行してください。WHEREこれにより、多くの痛みが軽減されます。更新する必要がある行が多すぎる場合は、SELECT TOP 5000または何かを使用して、少なくともそれらのいくつかを確認できるようにします。更新する前に、何を更新するかを常に正確に把握してください。

于 2012-03-11T12:49:58.867 に答える
0

注文日が次の範囲内でなければならないtoday's date and 60 days before場合は、次の手順を実行する必要があります。

WHERE start_date BETWEEN dateadd(day,-60,getdate()) AND getdate();
于 2012-03-11T12:51:55.707 に答える
0

クエリ アナライザーを使用して、キャンセルする注文のビューを作成します。ビューは素晴らしいです。ビューを使用すると、ビューに正しいデータのサブセットが含まれているかどうかを確認しながら、一度に 1 つずつデータのサブセットを構築できます。例えば:

Total_Payment_Received = 0 のすべての注文を表示する、 viewOrdersToCancelという名前の作成から始めます (これは、フィルター列内に= 0を入力することによって行われます) 。

それらのレコードだけを表示するには、SELECT * FROM viewOrdersToCancelを実行します。

次に、ビューを変更し、DateAdd(d,-60, GetDate()), GetDate())基準の間に OrderDate を追加します。

それらのレコードだけを表示するには、別のSELECT * FROM viewOrdersToCancelを実行します。

ここで、ビューを変更して、in 句内に異なるOrderStatus値を追加します。

ビューには、「キャンセル済み」に設定する注文のサブセットが含まれています

内部結合を使用して update ステートメントを実行するだけです
(これは、一意の OrderId があることを前提としています) 。

UPDATE Orders  
SET OrderStatus = 'Cancelled'  
FROM Orders t1  
INNER JOIN viewOrdersToCancel t2  
ON t1.OrderId = t2.OrderId
于 2012-03-11T13:43:43.153 に答える