我正在使用SQL Server 2008.我正在寻找一种创造性的方法来保存和更新数据库中的日期列表。
我将从应用程序中收集日期列表,我将需要检查每个值是否已经存在,如果没有添加,然后删除列表中不存在于数据库中的任何日期。
我能想到的最简单的事情是删除与此特定请求关联的所有日期,然后迭代列表中的每个项目并插入数据库。
有没有人有更优雅的想法?
答案 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
不确定您的应用程序是如何编码的,所以很遗憾无法建议任何代码来调用该程序