0

我正在使用 Visual Studio 2010、Windows XP 和 SQL Server CE。

我想做一个这样的数据库表:

CREATE TABLE Logs  
(  
    Id int,  
    ***LogTime datetime***,  
    Register1 smallint,  
    Register2 smallint,  
    Register3 smallint,  
)  

Id 将是主键和身份。

我有这些我无法解决的问题:

  1. 该表将由大批量插入(有时甚至多达 300k 条记录)填充,因为“数据源”将是插入 PC 的 USB 中的文件。此二进制格式文件包含按时间排序的日志。我的软件必须抓取、解码并准备要添加到数据库的记录。
  2. 数据库中不能有重复的日期时间(2 条具有相同日期时间的记录),因为最终会根据该表的数据制作图表。

所以第一次批量插入就可以了,例如:

1, 2013-01-01 12:34:12, 12, 100, 200  
2, 2013-01-01 12:34:24, 13, 100, 212  
3, 2013-01-01 12:34:36, 11, 110, 208  
...  
100, 2013-01-01 14:04:58, 15, 120, 198  

但是下一个要插入的文件将具有旧内容+其他新的后续记录。而且我只需要插入新记录(否则我正在创建记录副本)。

所以
文件 1:从 1 月 1 日到 1 月 5 日
文件 2:从 1 月 1 日到 1 月 8 日

目前我已经将数据库表实现为一个平面二进制文件,在插入之前,我用 O(N) 线性扫描找到“插入点”,然后我可以追加新数据。

我想使用 SQL Server CE 而不是平面二进制文件作为数据容器。

任何建议将不胜感激

4

2 回答 2

1

由于您提到“按时间排序的日志”,我假设您插入的记录不可能来自最后一次插入之前。例如,日期总是唯一的并且总是升序的。(例如,某些程序每 12 秒向文件添加一条记录。)

在这种情况下,创建一个变量来保存最近的日期:

DECLARE @Last_Datetime DATETIME

然后只需创建一个与您计划插入的表的架构相匹配的临时表:

CREATE TABLE dbo.#Temp_Logs  
(
    LogTime datetime, 
    Register1 smallint,  
    Register2 smallint,  
    Register3 smallint,  
)

并批量插入该表。

然后抓取最近的记录:

SELECT @Last_Datetime = MAX(L.LogTime)
FROM dbo.Logs as L

然后使用INSERT SELECTwithWHERE子句移动行:

INSERT Logs
SELECT
    TL.datetime,
    TL.Register1,
    TL.Register2,
    TL.Register3
FROM dbo.#Temp_Logs AS TL
WHERE TL.datetime > @Last_Datetime
于 2013-01-23T16:37:42.840 回答
1

我建议您将数据批量插入临时表(先截断它),然后使用 EXCEPT 子句仅插入新记录。

INSERT INTO Logs (LogTime, Register1, Register2, Register3)
SELECT LogTime, Register1, Register2, Register3 FROM LogStaging
EXCEPT
SELECT LogTime, Register1, Register2, Register3 FROM Logs
于 2013-01-23T16:34:04.130 回答