sa_rowgenerator 系统过程 可生成开始日期至结束日期的所有区间

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

sa_rowgenerator 系统过程

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

 语法

sa_rowgenerator(
 [ rstart
 [, rend
 [, rstep ] ] ]
)

 参数

  • rstart   使用此可选的 INTEGER 参数指定起始值。缺省值是 0。

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

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

 结果集

列名数据类型说明
row_numINTEGER序列号。

 注释

此 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) 的地方。其中一些范围不含雇员,这时会出现警告。

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 表示所支持的最大有符号整数。

 
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 );

以下查询将返回 1900 至 2058 年之间包含 54 周的所有年份。

 
SELECT DATEADD ( day, row_num, '1900-01-01' ) AS d, DATEPART ( week, d ) w
FROM sa_rowgenerator ( 0, 63919, 1 )
WHERE w = 54;
 

以下查询显示有多少雇员生活在邮政编码范围为 (0-9999)、(10000-19999)、...、及 (90000-99999) 的地方。其中一些范围不含雇员,这时会出现警告。

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 表示所支持的最大有符号整数。

 
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 );

以下查询将返回 1900 至 2058 年之间包含 54 周的所有年份。

 
SELECT DATEADD ( day, row_num, '1900-01-01' ) AS d, DATEPART ( week, d ) w
FROM sa_rowgenerator ( 0, 63919, 1 )
WHERE w = 54;

 

 

 

SELECT
    1       AS tag,
    null    AS parent,
    null    AS [enc_obj!1!row_num]
 FROM
    sa_rowgenerator(1, 2)
UNION 
select
    1
   ,1
   ,row_num
 FROM
    sa_rowgenerator(1, 2)
ORDER BY
    3, 1
FOR JSON EXPLICIT;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值