我想生成从0到9000000的数字。在Oracle中,我可以使用以下代码。我如何在Sybase ASE中做到这一点?
这是Oracle中的:
SELECT level Num
FROM DUAL
CONNECT BY LEVEL <= 9000000
ORDER BY Num;
如何在Sybase ASE中做到这一点?
我不能创建一个表并添加一个标识,因为我需要从1到9000000的数字,所以一个表将是复杂的。是否有查询来执行此操作?
发布于 2017-05-29 15:50:03
在Sybase中,有一个可以用来生成数字的系统过程:行发生器
你本可以这样做:
SELECT row_num FROM sa_rowgenerator( 1, 9000000);
我根本不知道Sybase ASE,所以我搜索了它,发现这个过程在ASE中是不可用的,但是有一个替代方案:
ASE不支持system系统过程sa_rowgenerator、sa_split_list和sa_conn_info。ASE主数据库包含一个表spt_values,该表可用于以类似于sa_rowgenerator过程或system的dbo.row_generator系统表的方式选择整数值。
这个包含整数的表spt_values
是难以置信的没有文档化。就像一张鬼桌。
我建议你试一试:
select number
FROM master.dbo.spt_values
WHERE number BETWEEN 0 AND 9000000
但如果你的数据库系统爆炸,我不负责;-)
发布于 2017-05-26 22:19:52
你能否提供一些细节,说明你计划如何使用这900万(+1)个数字?
如果唯一的目的是将一个数字流发送回客户端,那么在我看来,让客户机应用程序生成900万个号码就更有效了。
有许多方法可以根据少数几个较小的表的笛卡儿积(参见RMH的基-10示例)使用单个查询生成数字序列,但所有这些解决方案都需要:
无论您想要生成一个小的数字集(1到10)还是一组大的数字(1到9,000,000),都需要对相同的“生成器”查询进行这种开销。
显然,需要使用一种更好、更高效、更轻量级的方法来防止占用数据服务器资源(例如,imaagine几个用户/应用程序试图生成9,000,000个数字.都使用了大量的tempdb空间以及cpu资源..。盖德..。期待来自DBA的愤怒的电子邮件/电话!)
另一个想法是使用循环构造来生成所需的数字.
declare @counter bigint, @max bigint
select @counter=0, @max=9000000
while @counter <= @max
begin
select @counter
select @counter=@counter+1
end
..。虽然这将消除tempdb开销,但您仍然需要消耗少量的cpu资源,循环900万次。额外的性能影响可能来自生成900万1行结果集的开销,特别是您可能会看到过多的网络数据包在数据服务器和客户端应用程序之间流动。
虽然我们可以通过使最终结果看起来像单个结果集来减少网络数据包的数量,但这需要将上面的循环构造转换为存储过程,确保您已经定义了一个回送服务器,然后创建一个要引用的代理表,proc说;然后您将查询代理表以获得一个看起来包含所需的一组数字的结果集。
当然,在这一点上,我们现在必须跳过几圈,才能让数据服务器生成一系列数字(在某种程度上是有效的方法)作为单个结果集。
Sybase/ASE可以通过其他方法生成一系列数字(例如,创建/填充带有标识列的表),但所有这些都需要一些良好的数据服务器资源,或者( b)一些复杂的代码(例如,应用程序上下文函数,插件java代码).执行客户端/前端应用程序可能更有效地处理的事情。
https://stackoverflow.com/questions/44028603
复制相似问题