2011-01-24 9 views
1

私は1日に1回だけデータをデータベースに挿入しようとしています。問題は、SQLクエリでこれをチェックしたい(コードが触れられないため)。1日に1回挿入する

現在、誰かが特定のWebページに行くと、いつspInsertRateプロシージャを呼び出すか。私は推測している

INSERT INTO dbo.LU_ExchangeRates 
(exch_Date,exch_Currency,exch_Rate) 
VALUES(@exchDATE,@exchCurrency,@exchRate) 

は、私が最初のSELECT文を実行する必要があり、そしてselect文が行を返さない場合、それはINSERT文を実行することを意味します。私はちょうどこれをコード化する方法を理解できません。

+0

「現在、誰かが特定のWebページに行くときはいつでも、spInsertRateプロシージャを呼び出します。」というメッセージが表示される場合は、設計上の問題が生じる可能性があります。 – RichardTheKiwi

答えて

4

あなたは、これが

IF NOT EXISTS ( 
      SELECT * from dbo.LU_ExchangeRates 
      WHERE 
       exch_Date = @exchDATE and exch_Currency = @exchCurrency) 

    INSERT INTO dbo.LU_ExchangeRates 
    (exch_Date,exch_Currency,exch_Rate) 
    VALUES 
     @exchDATE,@exchCurrency,@exchRate 
+0

+1にはIFが必要ありません – RichardTheKiwi

4

私はexch_Date列に一意制約を設定してから、spInsertRateに挿入を実行させ、失敗した場合に例外をキャッチします。

+0

特に、フロントエンドコードは変更しないことが記載されています。 – RichardTheKiwi

+2

これはフロントエンドコードとは関係ありません。制約に違反したときに発生するT-SQL例外があります。これらはSPの中に捕らえられ、適切に飲み込まれます。 –

1
IF NOT EXISTS (SELECT * FROM dbo.LU_ExchangeRates WHERE exch_Date = @exchDATE) 
BEGIN 
INSERT INTO dbo.LU_ExchangeRates (exch_Date,exch_Currency,exch_Rate) VALUES(@exchDATE,@exchCurrency,@exchRate) 
END 
0

を見るために

INSERT INTO dbo.LU_ExchangeRates 
(exch_Date,exch_Currency,exch_Rate) 
SELECT 
    @exchDATE,@exchCurrency,@exchRate 
WHERE 
    NOT EXISTS ( 
     SELECT * from dbo.LU_ExchangeRates 
     WHERE 
      exch_Date = @exchDATE and exch_Currency = @exchCurrency) 

が、そのより一般的に動作します、単一のSQLとしてそれをしなければならない場合、私はそれならば、その挿入を行い、単一のクエリを行うだろうテーブルの今日の日付を見つけることはありません。そうすれば、あなたはインサートを選択する間に競争することはありません。たぶん

INSERT INTO dbo.LU_ExchangeRates (...) 
SELECT @exchDate, ... 
WHERE NOT EXISTS (SELECT * 
        FROM dbo.LU_ExchangeRates 
        WHERE exch_date >= @exchDate 
        AND exch_Currency != @exchCurrency) 
+0

[これはまだ競合状態です。](http://stackoverflow.com/questions/3407857/only-inserting-a-row-if-its-not-already -そこ) –

1

あなたはIGNORE_DUP_ROWSオプション(または何だ、その名)との複合一意のインデックスを定義することができ、その後、故障したインサートは、黙って破棄されます。

これは、Sybase ASEで実行できますが、MS SQLサーバでは実行できません。

関連する問題