在SQL中生成序列号-不使用标识
我正在处理一个任务,在这个任务中,我的查询将生成一个固定宽度的列。“固定宽度”列中的一个字段需要是按顺序生成的数字 以下是我的疑问:在SQL中生成序列号-不使用标识,sql,sql-server,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*','~'
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”,即序列号
有人帮忙吗 您可以使用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代替?您可以使用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来代替?您可以创建一个对象,然后在查询中调用序列
大致如下:
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
您必须调整填充有多少个零,以及根据您的要求修剪多少个数字。如果重复值正常,则可以定期重置序列。有关更多信息,请参阅文档。这只是CREATE语句中的另一行。您可以创建一个对象,然后在查询中调用序列
大致如下:
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
您必须调整填充有多少个零,以及根据您的要求修剪多少个数字。如果重复值正常,则可以定期重置序列。有关更多信息,请参阅文档。这只是CREATE语句中的另一行。提示:行号我会问您为什么要这样做?粉碎字符串中的顺序值通常是数据未正确规范化的标志。通过将多个值填充到一个元组中,这几乎表明违反了1NF。那么,您将如何正确地对其进行排序?当你用完了数字,因为看起来你想要的长度是2,你会怎么处理?当您达到100时会发生什么?您对这个顺序生成的数字部分有任何最大限制吗?是否低于100?您使用的是哪个版本的SQL Server?选择@版本;我对生成的序列号没有任何限制。提示:row_numberI会问您为什么要这样做?粉碎字符串中的顺序值通常是数据未正确规范化的标志。通过将多个值填充到一个元组中,这几乎表明违反了1NF。那么,您将如何正确地对其进行排序?当你用完了数字,因为看起来你想要的长度是2,你会怎么处理?当您达到100时会发生什么?您对这个顺序生成的数字部分有任何最大限制吗?是否低于100?您使用的是哪个版本的SQL Server?选择@版本;我对生成的序列号没有任何限制。当从表中添加/删除行时,行号可以在查询的两次运行之间更改。@Gordon Linoff您的答案只能在序列号的100以下工作number@AnushaSubashini . . . 不是我。OP中只有两位数字。当从表中添加/删除行时,行号可以在查询的两次运行之间更改。@Gordon Linoff您的答案仅适用于序列号的100以下number@AnushaSubashini . . . 不是我。OP只有两位数字。谢谢Eric。这是有益的,很高兴它是有用的。谢谢,谢谢埃里克。这是有益的,很高兴它是有用的。谢谢