保存/更新数据库中的日期列表

时间:2012-06-25 20:19:38

标签: sql-server-2008 tsql stored-procedures

我正在使用SQL Server 2008.我正在寻找一种创造性的方法来保存和更新数据库中的日期列表。

我将从应用程序中收集日期列表,我将需要检查每个值是否已经存在,如果没有添加,然后删除列表中不存在于数据库中的任何日期。

我能想到的最简单的事情是删除与此特定请求关联的所有日期,然后迭代列表中的每个项目并插入数据库。

有没有人有更优雅的想法?

2 个答案:

答案 0 :(得分: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别名使用左外连接来执行“not in”。我经常发现这样做效果更好。无论您如何设置查询(如此或使用合并),您都应该在日期中添加索引。它应该让事情变得更快。

答案 1 :(得分: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

不确定您的应用程序是如何编码的,所以很遗憾无法建议任何代码来调用该程序