我正在使用Visual Studio 2010,Windows XP和SQL Server CE。
我想创建一个这样的数据库表:
CREATE TABLE Logs
(
Id int,
***LogTime datetime***,
Register1 smallint,
Register2 smallint,
Register3 smallint,
)
Id将是主键和身份。
我遇到了无法解决的问题:
所以第一个批量插入会很好,例如:
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而不是平面二进制文件作为数据容器。
任何建议都将受到赞赏
答案 0 :(得分:1)
我建议您将数据批量插入临时表(先截断它),然后使用EXCEPT子句仅插入新记录。
INSERT INTO Logs (LogTime, Register1, Register2, Register3)
SELECT LogTime, Register1, Register2, Register3 FROM LogStaging
EXCEPT
SELECT LogTime, Register1, Register2, Register3 FROM Logs
答案 1 :(得分: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 SELECT
子句的WHERE
来移动行:
INSERT Logs
SELECT
TL.datetime,
TL.Register1,
TL.Register2,
TL.Register3
FROM dbo.#Temp_Logs AS TL
WHERE TL.datetime > @Last_Datetime