2009-02-16 139 views
1

这是可行的吗?原因是我使用了一个像队列一样的表格,依次弹出TOP(1)元素进行处理。我想插入一些行来立即处理。顺便说一句,谢谢。SQL Server CE:将行插入表顶部

回答

4

您需要一个列来维护订单,身份或时间戳。然后你可以通过“x desc”选择“top(1)order”来获得最近的。

+0

我正在考虑这样的事情,添加一个优先级列并按顺序排序。希望它允许我修改非空表的模式,谢谢。 – Pablote 2009-02-16 13:06:03

0

1)如果你使用表格作为队列,你使用的工具是错误的工具。表格是固有的无序数据集。这是因为

2)行可以根据其任何字段的值进行排序。这意味着您可以通过向该行添加一个值(通常是ID)并在表格中的其他行之前添加一个值来“插入”中间的内容。

为什么使用数据库表来做到这一点?你显然正在寻找一个优先队列。如果您这样做是因为您希望在软件失败时正在处理的作业持续存在,请考虑将所有项及其优先级添加到表中,然后将其取出并插入到适当的优先级队列中软件,将您的数据存储从您的调度机制中分离出来。

+0

我知道表是什么,但有时也有这份工作没有合适的工具。我需要一个持久的事务存储和msmq或类似的东西,这是不可能安装的。由于只有一个应用程序访问商店,SqlServer CE似乎是最好的选择,它的表现相当好。 – Pablote 2009-02-16 13:05:01

3

你的数据库(连同您的身份)创建一个优先级列,然后排序就可以了:

CREATE TABLE myqueue(priority INT NOT NULL, id INT IDENTITY NOT NULL PRIMARY KEY, payload VARCHAR(200) NOT NULL) 

CREATE INDEX ix_myqueue(priority, id) 

INSERT 
INTO myqueue (priority, payload) 
VALUES (0, 'Regular message') 

INSERT 
INTO myqueue (priority, payload) 
VALUES (1, 'Urgent message') 

SELECT id, payload 
FROM myqueue 
ORDER BY priority DESC, id DESC 
TOP 1 

id | payload 
2 | Urgent message 

DELETE 
FROM mytable 
WHERE id = 2 

SELECT payload 
FROM myqueue 
ORDER BY priority DESC, id DESC 
TOP 1 

id | payload 
1 | Regular message 

DELETE 
FROM mytable 
WHERE id = 1