我正在执行一项任务,其中我的查询将产生固定宽度的列。固定宽度列中的一个字段必须是顺序生成的数字。
下面是我的查询:
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
我的输出:
是否可以将@num声明为可顺序生成数字的参数?
PS:CONCAT函数内的所有字段均为硬编码。只有'XX',即必须动态生成序列号
有帮助吗?!
答案 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)
代替?
。