2012-06-25 61 views
0

我正在使用SQL Server 2008.我正在尋找一種創造性的方式來保存和更新我們數據庫中的日期列表。保存/更新數據庫中的日期列表

我打算從應用程序中收集日期列表,我需要檢查每個值是否已經存在(如果不添加),然後刪除列表中已存儲在數據庫中的任何日期。

我能想到的最簡單的事情是刪除與此特定請求關聯的所有日期,然後遍歷列表中的每個項目並插入到數據庫中。

有沒有人有更優雅的想法?

+5

使用合併。這可能有所幫助:http://blog.sqlauthority.com/2010/06/08/sql-server-merge-operations-insert-update-delete-in-single-execution/ – Kermit

回答

0

您可以使用合併。您還可以將日期加載到一個臨時表中,執行插入,如:

with toinsert as (
    select thedate 
    from #newdates nd left outer join 
     alldates ad 
     on nd.thedate = ad.thedate 
    where ad.thedate is null 
) 
insert into alldates(thedate) 
    select thedate 
    from toinsert 

的toinsert別名使用左外連接「在不是」做。我經常發現這個效果更好。無論您如何設置查詢(像這樣或通過合併),您都應該在日期中加入索引。它應該讓事情變得更快。

0

我會使用表值參數和NOT EXISTS函數的組合。因此,將您的日期從應用程序傳遞到存儲過程作爲參數,然後存儲過程將返回插入到應用程序中的所有日期的列表。#

第一步是創建類型,以便您可以傳遞您的程序日期列表:

CREATE TYPE dbo.DateListType AS TABLE (Date DATETIME) 

接下來創建您的程序。我假設你的日期表叫做dbo.Dates,你很明顯需要用你的表替換你的表。

CREATE PROCEDURE dbo.InsertDates (@Dates dbo.DateListType READONLY) 
AS 
BEGIN 
    DECLARE @Inserted TABLE (Date DATETIME) 

    INSERT INTO dbo.Dates 
    OUTPUT inserted.Date INTO @Inserted 
    SELECT Date 
    FROM @Dates d 
    WHERE NOT EXISTS 
      ( SELECT 1 
       FROM dbo.Dates 
       WHERE Dates.Date = d.Date 
      ) 

    SELECT Date 
    FROM @Inserted 
END 

不知道你的應用程序在編碼所以很遺憾不能提出任何代碼來調用程序