Вызов вставки один раз в день - PullRequest
1 голос
/ 25 января 2011

Я ищу для вставки данных в базу данных только один раз в день. Проблема в том, что я хочу, чтобы запрос sql проверил это (так как код неприкасаемый)

В настоящее время каждый раз, когда кто-то заходит на определенную веб-страницу, он вызывает процедуру spInsertRate.

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

Я предполагаю, что сначала мне нужно сделать оператор выбора, и если оператор выбора не возвращает строку, это означает запуск оператора вставки. Я просто не могу понять, как кодировать это.

Ответы [ 5 ]

4 голосов
/ 25 января 2011

, если вы должны сделать это как один SQL, это будет работать

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
4 голосов
/ 25 января 2011

Я бы наложил уникальное ограничение на столбец exch_Date, затем spInsertRate запустил вставку и перехватил исключение в случае сбоя.

1 голос
/ 25 января 2011

Вы можете определить составной уникальный индекс с параметром IGNORE_DUP_ROWS (или как его имя), и тогда любые неудачные вставки будут молча отброшены.

Это можно сделать в Sybase ASE, возможно, не в MS SQLсервер.

1 голос
/ 25 января 2011
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 голосов
/ 25 января 2011

Я бы сделал один запрос, который выполняет вставку, если не находит сегодняшнюю дату в таблице. Таким образом, у вас нет гонки между выбором и вставкой. Может быть,

INSERT INTO dbo.LU_ExchangeRates (...)
SELECT @exchDate, ...
 WHERE NOT EXISTS (SELECT *
                     FROM dbo.LU_ExchangeRates
                    WHERE exch_date >= @exchDate
                     AND exch_Currency != @exchCurrency)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...