2011-01-24 31 views
1

我期待每天只向数据库插入一次数据。问题是我想用sql查询来检查它(因为代码是不可触及的)每天调用一次插入

当前任何时候任何人访问某个网页时,都会调用spInsertRate过程。

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

我猜我必须首先做一个SELECT语句,如果select语句不返回行,这意味着运行插入语句。我只是无法弄清楚如何为此编写代码。

+0

如果发生这种情况,您可能会遇到一些设计问题当前任何时候任何人访问某个网页时都会调用spInsertRate过程。什么速率正在插入,或者每个货币有一次? – RichardTheKiwi

回答

4

,如果你一定要做到为单一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 
+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 (...) 
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服务器上完成。