2009-07-21 84 views
1

好的,我有一个问题涉及到我以前遇到的问题。我知道如何解决这个问题,但是我们在尝试重现错误时遇到了问题。Sybase选择变量逻辑

我们有一系列基于其他记录创建记录的过程。记录通过link_id链接到主记录。在这抓住一个link_id程序,查询

select @p_link_id = id --of the parent 
from table 
where thingy_id = (blah) 

现在,有在表的活动多行。有些可以取消。我拥有的代码并不会在select语句中排除已取消的行,因此如果先前已取消行,那些id将出现在select中。如果我拒绝已取消的行,总会有一个“开放”记录被选中。 (追加where status != 'C'

这就解决了这个问题。但是,我需要能够在我们的开发环境中重现此问题。

我已经经历了一个过程,在这个过程中,我输入了一整堆数据,打开,取消等尝试让这个select语句返回一个无效的id。但是,每当我运行select时,id都是按顺序生成的,但是在发生此错误的情况下,select语句返回似乎是第一个值的变量。

例如。

ID Status 
1 Cancelled 
2 Cancelled 
3 Cancelled 
4 Open 

鉴于上述,如果我做了一个选择我想要的ID,我想得到'4'。在错误中,结果是1.但是,即使我输入了10个已取消的记录,我仍然可以得到最后一个记录。

在oracle中,我知道如果你选择一个变量并返回多个记录,你会得到一个错误(我认为)。 Sybase显然可以将多个值分配给变量而不会出错。

我在想如何从表中选择数据,其中没有排序顺序的ID不按升序顺序返回,或者有一个选择到变量中的dboption保存查询的第一个或最后一个值。

编辑:它看起来像我们可以通过回滚存储过程更改来重现此错误。但是,procs不会靠近这个link_id列。是否有可能对数据库体系结构进行更改可能会破坏索引或其他内容?

+0

请问这是[标签:sybase-asa],[标签:sybase-ase],[标签:sybase-iq]还是[标签:sqlanywhere]?试图清理[sybase]标记... – 2013-03-14 07:31:05

回答

2

如果返回多于一行,则根据this,存储的值将是列表中的最后一个值。

如果您还没有通过ORDER BY指定检索的订单,那么返回的订单将在数据库引擎的方便之处。它可能会因数据库实例而异。它可能按照创建的顺序,或者由于数据在数据库块结构中的放置位置而显示为“随机”。

这个故事的寓意是:

  1. 总是让单身SELECT回归单行
  2. 当#1无法做到的,使用ORDER BY,以确保您所关心的一个来最后一个