Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中生成序列号-不使用标识_Sql_Sql Server - Fatal编程技术网

在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。这是有益的,很高兴它是有用的。谢谢,谢谢埃里克。这是有益的,很高兴它是有用的。谢谢