在SQL中生成序号-不用身份

时间:2019-01-08 19:15:58

标签: sql sql-server

我正在执行一项任务,其中我的查询将产生固定宽度的列。固定宽度列中的一个字段必须是顺序生成的数字。

下面是我的查询:

select
_row_ord = 40,
_cid = t.client_num,
_segment = 'ABC',
_value = 
concat(
'ABC*',
'XX**', --Hierarchical ID number-this field should be sequentially generated
'20*',
'1*','~'
    )
from #temp1 t

我的输出:

enter image description here

是否可以将@num声明为可顺序生成数字的参数?

PS:CONCAT函数内的所有字段均为硬编码。只有'XX',即必须动态生成序列号

有帮助吗?!

2 个答案:

答案 0 :(得分:3)

您可以创建一个SEQUENCE对象,然后在查询中将NEXT VALUE FOR称为read

遵循以下原则:

SEQUENCE

然后:

CREATE SEQUENCE dbo.ExportValues
    START WITH 1  
    INCREMENT BY 1 ;  
GO  

您必须调整填充的零个数以及为您的要求将其修整为多少个数字。如果可以使用重复的值,则可以定期重置select _row_ord = 40, _cid = t.client_num, _segment = 'ABC', _value = concat( 'ABC*', RIGHT(CONCAT('000000000000000', NEXT VALUE FOR dbo.ExportValues),15) '**', '20*', '1*','~' ) from #temp1 t 。有关更多信息,请参见文档。这只是SEQUENCE语句中的另一行。

答案 1 :(得分:1)

您可以使用row_number() -由于将其填充为零,因此变得更加复杂:

select _row_ord = 40, _cid = t.client_num, _segment = 'ABC',
       _value = concat('ABC*',
                       right('00' + convert(varchar(255), row_number() over (order by ?)), 2),
'XX**', --Hierarchical ID number-this field should be sequentially generated
                       '20*',
                       '1*','~'
                       )
from #temp1 t;

请注意,?用于指定顺序的列。如果您不关心数字的顺序,请使用(select null)代替?