我正在使用SQL Server 2008.我正在尋找一種創造性的方式來保存和更新我們數據庫中的日期列表。保存/更新數據庫中的日期列表
我打算從應用程序中收集日期列表,我需要檢查每個值是否已經存在(如果不添加),然後刪除列表中已存儲在數據庫中的任何日期。
我能想到的最簡單的事情是刪除與此特定請求關聯的所有日期,然後遍歷列表中的每個項目並插入到數據庫中。
有沒有人有更優雅的想法?
我正在使用SQL Server 2008.我正在尋找一種創造性的方式來保存和更新我們數據庫中的日期列表。保存/更新數據庫中的日期列表
我打算從應用程序中收集日期列表,我需要檢查每個值是否已經存在(如果不添加),然後刪除列表中已存儲在數據庫中的任何日期。
我能想到的最簡單的事情是刪除與此特定請求關聯的所有日期,然後遍歷列表中的每個項目並插入到數據庫中。
有沒有人有更優雅的想法?
您可以使用合併。您還可以將日期加載到一個臨時表中,執行插入,如:
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別名使用左外連接「在不是」做。我經常發現這個效果更好。無論您如何設置查詢(像這樣或通過合併),您都應該在日期中加入索引。它應該讓事情變得更快。
我會使用表值參數和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
不知道你的應用程序在編碼所以很遺憾不能提出任何代碼來調用程序
使用合併。這可能有所幫助:http://blog.sqlauthority.com/2010/06/08/sql-server-merge-operations-insert-update-delete-in-single-execution/ – Kermit