1

Pickup テーブルに 2 つの値を挿入するプロシージャを作成しようとしています。

create procedure sp_InsertPickup
@ClientID int,
@PickupDate date 
as 
insert into Pickup (ClientID ,PickupDate )values (@ClientID,@PickupDate)

ただし、このクライアントが今月 (テーブルのレコード) に既に集荷を行っているかどうかを確認する必要があります。テーブルに新しいレコードを挿入しないでください。このデータがテーブルにある場合の例

ClientID PickupDate
11       03-01-2013

そしてClientId 11 and new PickupDate 03-24-2013、この人は今月すでにピックアップを行っているので、挿入しないでください。それを実装する方法はありますか?

4

3 に答える 3

2

これを行う最も安全な方法はmerge、テーブルに制約を使用または設定して、エラーをトラップすることです。

より安全な理由mergeは、アトミック トランザクションであるためです。他の誰かがすでに行を挿入 (または削除) している可能性があるため、存在を確認してから挿入を行うのは危険です。ストアド プロシージャでトランザクション セマンティクスを試してみることはできますが、SQL Server が提供するものを気にする必要はありませんmerge

merge Pickup as target
using (select @PickupDate, @ClientId) as source(PickupDate, ClientId)
    on target.clientId = source.ClientId and year(source.PickupDate) = year(target.PickupDate) and month(source.PickupDate) = month(target.PickupDate)
when NOT MATCHED then
    insert(PickupDate, ClientId) values(source.PickupDate, source,ClientId);

について詳しく読むことができmerge ます

于 2013-03-23T23:05:14.230 に答える
2

その場合は、次を使用しIF NOT EXISTSます。

CREATE PROCEDURE dbo.InsertPickup
    @ClientID int,
    @PickupDate date 
AS
   IF NOT EXISTS (SELECT * FROM Pickup 
                  WHERE ClientID = @ClientID 
                    AND MONTH(PickupDate) = MONTH(@PickupDate) 
                    AND YEAR(PickupDate) = YEAR(@PickupDate) )
      INSERT INTO Pickup (ClientID, PickupDate)
      VALUES (@ClientID, @PickupDate)

すでに存在するという事実のために、データが挿入されなかったことを呼び出し元に何らかの形で示したい場合があります....

補足として、ストアド プロシージャにはプレフィックスを使用しないでください。sp_Microsoft はそのプレフィックスを独自の使用のために予約しており (名前付けストアド プロシージャを参照)、将来的に名前が競合するリスクがあります。また、ストアド プロシージャのパフォーマンスも低下します。接頭辞として他のものを単に避けsp_て使用するか、接頭辞をまったく使用しないことをお勧めします。

于 2013-03-23T22:01:31.343 に答える
1

これは、使用して実装する方法ですIF NOT EXISTS

create procedure sp_InsertPickup
    @ClientID int,
    @PickupDate date 
as 
    IF NOT EXISTS (SELECT * FROM Pickup 
                            WHERE ClientID = @ClientID 
                            AND DATEPART(mm,PickupDate) = DATEPART(mm,@PickupDate)
                            AND DATEPART(yy,PickupDate) = DATEPART(yy,@PickupDate))
    BEGIN
        insert into Pickup (ClientID ,PickupDate )values (@ClientID,@PickupDate)
    END
begin
end
于 2013-03-23T22:05:16.950 に答える