0

如何使 Sybase 的数据库引擎以非数字顺序返回未排序的记录列表?

~~~

我有一个问题,我需要在应用程序中重现错误,在该应用程序中我从按顺序生成 ID 的表中进行选择,但 ID 不是选择中的最后一个。

让我解释。

ID    STATUS
_____________
1234   C
1235   C
1236   O

上面是3个ID。我有代码,这些将是

select @p_id = ID from table where (conditions).

但是,没有检查 status = 'O' (open) 的子句。记住 Sybase 将最后返回的记录保存到一个变量中。

~~~~~

我被要求给测试团队一些会使结果不起作用的东西。如果 Sybase 在无序列表中选择上述内容,它可能会以升序出现,或者,如果数据库引擎需要更改存储数据块或一些技术魔法的东西,则顺序可能会被打乱。最初的错误是当程序返回 1234 而不是 1236 时。

有没有一种方法可以100% 保证Sybase 将搜索一个数据块并且必须加倍返回,有效地“破坏”升序搜索,并且不返回最后一条记录,而是返回任何其他记录?(除了最大值之外的所有记录都会出错,因为它们都是“关闭的”)

我想要某种神奇的 SQL 代码,以确保事情不会以完全数字顺序搜索表。理想情况下,我希望不必更改程序,因为测试团队希望看到完全相同的程序被破坏(就像敲击 aorder by id desc会捏造结果一样简单)。

4

1 回答 1

2

如果不指定顺序,则无法保证结果的返回顺序。然而,索引将被构建——并且可能取决于插入顺序、索引类型和索引键的内容。

做那些单例通常是个坏主意SELECT。您应该始终使用子句指定特定记录WHERE,或者使用游标,或者TOPn或类似的。当有人试图理解您的代码时,问题就出现了,因为有些数据库在看到多次命中时采用第一个值,有些采用最后一个值,有些采用随机值(他们称之为“实现定义的”),有些则抛出一个错误。

这是否与1156837有关?:)

于 2009-08-12T01:29:35.997 回答