2010-02-07 32 views
1

使用SQL Server 2005插入值

當我插入日期時,應該比較表中的日期。

如果它是與其他日期相等時,它應該顯示一個錯誤消息,並且也應該只允許插入一個日期。

對於實施例

表1

Date 

20091201 
20091202 

Insert into table1 values('20091202') 

上述查詢不應允許插入相同的值

Insert into table1 values('20091204') 

上述查詢也不應該允許插入長間隙日期。

查詢應該只允許下一個日期。 它不應該允許相同的日期和較長的差距日期。

如何在此條件下插入查詢。

有可能在SQL或VB.Net

需要SQL查詢或VB.Net代碼幫助

+4

不清楚你想要什麼,你想要驗證輸入,或者你想要一個「自動增量」日期作爲一個表上的列? – Hogan 2010-02-07 14:03:44

+0

是的我想驗證輸入,如果它等於或大於那麼(意味着它應該只允許下一個日期)。它不應該是所有的長期差距日期。 – Gopal 2010-02-08 05:31:53

回答

1

你可以使用一個where條款,以確保前一天出現在表中,而目前天是不是:

insert into table1 ([dateColumn]) 
select '20091204' 
where exists (
    select * from table1 where [dateColumn] = dateadd(d,-1,'20091204') 
) 
and not exists (
    select * from table1 where [dateColumn] = '20091204' 
) 

if @@rowcount <> 1 
    raiserror ('Oops', 16, 1) 

如果插入成功,@@rowcount將會否則設置爲1,則返回一個錯誤使用raiserror到VB。

+0

這是如何防止當前日期被插入兩次?我想你假設桌子上已經有了一個唯一的約束條件(儘管這個問題似乎意味着沒有)。 – 2010-02-07 15:31:24

+0

@Aaron Bertrand:對,我會爲此添加一個額外的檢查,一個唯一的約束也可以工作 – Andomar 2010-02-07 15:51:46

+0

唯一的約束更好,因爲確保插入此表的每個人都使用此特定查詢來執行此操作非常困難。 – 2010-02-07 19:19:24

0

聽起來像你的日期字段應該只是uniqueauto-increment

+2

'自動增量'的SQL Server等價物是'identity',據我所知,它只支持離散數字類型 – Andomar 2010-02-07 14:08:04

+0

@Andomar:自動遞增日期字段確實很愚蠢。日期有什麼意義? – Aaronaught 2010-02-07 15:41:36

1

爲什麼不直接在預先設定的日期表,一旦你想「插」在該日期更新行?

我不知道我的理解中插入一個新的日期只有一次,也絕不允許有間隙的點。你能否更詳細地描述你的業務問題?

當然,你可以使用一個IDENTITY列,然後有一個計算列或從計算天數的時間(有些日期)視圖。但IDENTITY列不保證連續性,也不保證自己的唯一性(除非單獨設置約束條件)。

防止重複應該具有唯一約束表級別來完成,而不是與查詢。您可以首先檢查重複項,以便以自己的方式處理錯誤(而不是讓引擎爲您舉例),但這不應該是您唯一的檢查。