2011-01-24 6 views
1

데이터를 하루에 한 번만 데이터베이스에 삽입하려고합니다. 문제는 SQL 쿼리가이를 확인하도록 코드를 건 드리려합니다.하루에 한 번만 삽입

현재 누군가가 특정 웹 페이지로 이동할 때마다 spInsertRate 프로 시저를 호출합니다. 내가 추측하고있어

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

은 내가 먼저 SELECT 문을 수행해야하고, 선택 문이 행을 반환하지 않는 경우, 그 삽입 문을 실행하는 것을 의미합니다. 이 코드를 작성하는 방법을 알아낼 수 없습니다.

+0

'현재 누군가가 특정 웹 페이지로 이동하면 언제든지 spInsertRate 절차를 호출합니다.'어떤 디자인 문제가 발생할 수 있습니다. 어떤 환율이 삽입되는 중이거나 각 통화에 대해 한 번 ?? – RichardTheKiwi

답변

4

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) 

만 작동합니다 그

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에서 삽입을 실행하고 실패하면 예외를 catch합니다. 당신은 하나의 SQL로 수행해야하는 경우

+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 (...) 
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 서버가 아닐 수도 있습니다.