【问题标题】:How to force table select to go over blocks如何强制表选择遍历块
【发布时间】:2015-05-26 13:11:05
【问题描述】:

如何使 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 代码,以确保事情不会以完全数字顺序搜索表。理想情况下,我希望不必更改程序,因为测试团队希望看到完全相同的程序被破坏(就像敲打order by id desc 一样容易会捏造结果)。

【问题讨论】:

    标签: sybase database-engine


    【解决方案1】:

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

    一般来说,做那种单例SELECTs 是个坏主意。您应该始终使用WHERE 子句指定特定记录,或使用游标,或TOPn 或类似的。当有人试图理解您的代码时,问题就出现了,因为有些数据库在看到多次点击时采用 first 值,有些采用 last 值,有些采用 随机的 值(他们称之为“实现定义的”),有些会抛出错误。

    这是否与1156837 有关? :)

    【讨论】:

    • 除了改变选择顺序,还有什么办法吗?理想情况下,我需要能够在执行此逻辑的过程之外更改某些内容,以便可以“正确测试”。是的,这与 1156837.. 但这次我需要打破它。
    • 据我所知,没有外部方法可以强制这种行为。行为背后的变量是隐藏的 - 不是故意的,而是因为它是由滥用语言引起的行为。
    • 还有一条评论 - 如果您能做到这一点,您可以保存该数据库,并在每次运行测试时恢复它。但是,如果任何事情发生了变化——数据,甚至是由于补丁而导致的 Sybase 引擎的安装——那么所有的赌注都没有了。
    • 我猜的也差不多。谢谢你的拉维尼奥。我只需要再次向测试团队解释我不能让它为他们打破:)
    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多