-1

アップグレードしたい手順があります。挿入する前に、ピックアップデータテーブルにクライアントの新しいレコードを挿入しています。このクライアントの新しいレコードが今月挿入されたかどうかを確認しています。はいの場合、新しいレコードを挿入していません。

クライアントの StatusID が (1,2,6) かどうかを確認するように更新しようとしています。これまでのところ、私はこれを持っています

alter PROCEDURE dbo.InsertPickup
    @ClientID int, --Required ClientID and PickupDate
    @PickupDate date 
AS
   IF NOT EXISTS (SELECT * FROM Pickup 
                  WHERE ClientID = @ClientID 
                    AND MONTH(PickupDate) = MONTH(@PickupDate) 
                    AND YEAR(PickupDate) = YEAR(@PickupDate) )
if exists (select * from clients where statusid in (1,2,6))
      INSERT INTO Pickup (ClientID, PickupDate)
      VALUES (@ClientID, @PickupDate)

ただし、たとえば statusid = 5 または 3 または 4 のクライアントの場合、まだレコードを挿入するのは正しくありません。

4

2 に答える 2

1

適切なインデントと BEGIN/END ラッパーは、クエリの問題を発見するのに大いに役立ちます。チェックを追加し、 sargableClientIDに対するテストも行いましたPickupDate(現在インデックスがある場合、または将来インデックスがある場合)。

IF NOT EXISTS 
(
  SELECT 1 
    FROM dbo.Pickup WHERE ClientID = @ClientID
    AND PickupDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, @PickupDate), 0)
    AND PickupDate < DATEADD(MONTH, DATEDIFF(MONTH, 0, @PickupDate)+1, 0)
)
BEGIN
  IF EXISTS
  (
    SELECT 1 
      FROM dbo.clients WHERE ClientID = @ClientID 
      AND statusid IN (1,2,6)
  )
  BEGIN
      INSERT INTO dbo.Pickup (ClientID, PickupDate)
      VALUES (@ClientID, @PickupDate);
  END
END

もちろん、ネストされたすべてのIFテストなしでこれを行うこともできます。

INSERT dbo.Pickup(ClientID, PickupDate)
  SELECT @ClientID, @PickupDate
    WHERE EXISTS 
    (
      SELECT 1 FROM dbo.clients WHERE ...
    )
    AND NOT EXISTS 
    (
      SELECT 1 FROM dbo.Pickup WHERE ...
    );
于 2013-04-02T22:16:06.027 に答える
1

2 番目のステートメントでclientsテーブルをフィルター処理していないため、期待どおりに機能していません。試す:@ClientIDIF EXISTS

if exists (select * from clients where statusid in (1,2,6) AND ClientID = @ClientID)
于 2013-04-02T22:16:46.107 に答える