Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 系统对象 » 系统过程 » 按字母顺排序的系统过程列表

 

sa_rowgenerator 系统过程

返回包含指定起始值和结束值之间的行的结果集。

语法
sa_rowgenerator(
 [ rstart
 [, rend
 [, rstep ] ] ]
)
参数
  • rstart   使用此可选的 INTEGER 参数指定起始值。缺省值是 0。

  • rend   使用此可选的 INTEGER 参数指定结束值。缺省值是 100。

  • rstep   使用此可选的 INTEGER 参数指定序列值的增量。缺省值是 1。

结果集
列名 数据类型 说明
row_num INTEGER 序列号。
注释

此 sa_rowgenerator 过程可用在查询的 FROM 子句中,以生成一个数字序列。此过程可以作为使用 RowGenerator 系统表的替代方法。可以为类似如下的任务使用 sa_rowgenerator:

  • 在结果集中为一定数目的行生成测试数据。

  • 生成一个结果集,其中包含为每个范围中的值生成的行。例如,可以为一个月的每一天生成一行,也可以生成邮政编码范围。

  • 生成一个查询,其结果集具有指定数目的行。这对于测试查询性能可能有用。

您可以使用以下语句模拟 RowGenerator 表的行为:

SELECT row_num FROM sa_rowgenerator( 1, 255 );
权限

副作用

另请参见
示例

以下查询返回的结果集包含当前月的每一天的一行记录。

SELECT DATEADD( day, row_num-1,
        YMD( DATEPART( year, CURRENT DATE ),
            DATEPART( month, CURRENT DATE ), 1 ) ) 
    AS day_of_month
    FROM sa_rowgenerator( 1, 31, 1 )
    WHERE DATEPART( month, day_of_month ) = 
       DATEPART( month, CURRENT DATE )
    ORDER BY row_num;

以下查询显示有多少雇员生活在邮政编码范围为 (0-9999)、(10000-19999)、...、及 (90000-99999) 的地方。其中一些范围内没有雇员,这时会出现警告:集合函数中的空值已消除 (-109)。sa_rowgenerator 过程可以用来生成这些范围,即使该邮政编码范围没有任何雇员。

SELECT row_num AS r1, row_num+9999
 AS r2, COUNT( PostalCode ) AS zips_in_range
FROM sa_rowgenerator( 0, 99999, 10000 ) D LEFT JOIN Employees
   ON PostalCode BETWEEN r1 AND r2
GROUP BY r1, r2
ORDER BY 1;

以下示例生成 10 行数据并将其插入到 NewEmployees 表中:

INSERT INTO NewEmployees ( ID, Salary, Name )
SELECT row_num, 
   CAST( RAND() * 1000 AS INTEGER ),
   'Mary'
FROM sa_rowgenerator( 1, 10 );

以下示例使用 sa_rowgenerator 系统过程来创建包含所有整数的视图。此示例中的值 2147483647 表示 SQL Anywhere 中所支持的最大有符号整数。

CREATE VIEW Integers AS
SELECT row_num AS n
FROM sa_rowgenerator( 0, 2147483647, 1 );

以下示例使用 sa_rowgenerator 系统过程来创建包含日期从 0001-01-01 到 9999-12-31 的视图。此示例中的值 3652058 表示 0001-01-01 和 9999-12-31 之间的天数,其中 0001-01-01 和 9999-12-31 分别为 SQL Anywhere 中所支持的最早和最晚的日期。

CREATE VIEW Dates AS
SELECT DATEADD( day, row_num, '0001-01-01' ) AS d
FROM sa_rowgenerator( 0, 3652058, 1 );