为什么TOP不能与SQLDependency一起使用?

时间:2012-09-12 18:16:06

标签: .net sql-server service-broker sqldependency

我有一个使用SQLDependency的应用程序。我希望在插入新行时向用户显示插入数据库表的最新行。

当我的查询是一个简单的select语句时,这可以正常工作,但考虑到我想显示最近插入的行,我将查询写成SELECT TOP语句。这导致了多个例外。在查看this问题后,我了解到TOP对SQLDependency无效,因此我必须找到其他解决方案。

这让我想到了两件事:

A)SQLDependency不支持TOP表达式的原因是什么?

B)我提出的解决方案是根据id排序结果,只显示最后一个。这工作正常,但我的表目前只有很少的行。我正在使用数据集,因此我预计它会在插入更多行时减慢 - 这就是为什么我想将查询限制为仅最新的行。有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

This article解释了Query Notifications技术如何利用索引视图技术,因此它具有相同的限制。为了创建有效的索引视图,必须能够仅从当前更新更新索引,而无需查看表中的任何其他行。如果允许TOP,那么百万美元的问题是:如果你删除TOP 中哪一行取代它的行?回答这个问题需要在表中搜索应该包含在TOP索引视图中的另一行,而不是删除的那一行。因此,包含TOP(或者,就此问题,MAX或MIN遇到同样问题)的索引视图无法有效维护,也不允许。

可以通过查询COUNT_BIG(*)检测到已插入行。一旦您收到通知计数已更改,查询新插入的行是微不足道的。您还将收到有关DELETES的通知(即误报)。

答案 1 :(得分:0)

@Remus Rusanu解释得很好。您不能{ "rules": { "users": { "$nickname": { ".write": "!data.exists()" } } } } 关键字用于SQL Command。但是,即使您仍要选择一些TOP数据,也可以使用以下替代解决方案。

我正在从数据库中选择所有记录,但是我只将10条记录放入列表中,并将此列表返回到仪表板。因此,每次我收到最新的十条记录。

您可以使用当前的SQL命令,而无需使用TOP关键字。我的是:

SQL命令:

TOP

然后,在您的应用程序中,您可以根据您的最高人数来填写列表。
查看我对以下源代码的评论。

Select [Id], [Name] FROM dbo.CUSTOMER where InsertDate = @InsertDate ORDER BY [ID] DESC;