Reg:自动递增SQL表中的值
我在一个名为it(EmployeeDetailKey-varchar(10))的字段中得到一个值,该值具有如下顺序值 000010000200003 它位于Employeedetail表中。当需要插入新的员工详细信息时,我必须获取最大值(EmployeeDetailKey)并按1递增,然后将其存储回去。如果我有10个需要插入的employeedetail记录,则必须遵循相同的步骤 如果最大值(EmployeeDetailKey)=00003,则在插入10条记录后 必须是00013。稍后在插入之后,让我们假设它必须插入100条记录 是00113 我怎样才能以MS-SQL语句的形式完成它Reg:自动递增SQL表中的值,sql,sql-server,auto-increment,Sql,Sql Server,Auto Increment,我在一个名为it(EmployeeDetailKey-varchar(10))的字段中得到一个值,该值具有如下顺序值 000010000200003 它位于Employeedetail表中。当需要插入新的员工详细信息时,我必须获取最大值(EmployeeDetailKey)并按1递增,然后将其存储回去。如果我有10个需要插入的employeedetail记录,则必须遵循相同的步骤 如果最大值(EmployeeDetailKey)=00003,则在插入10条记录后 必须是00013。稍后在插入之后
请注意,该列不能是标识类型。只需将标识列添加到表中即可。我想提出如下建议:
IntEmployeeDetailKey int not null identity(1, 1) primary key,
. . .
然后添加一个计算列:
EmployeeDetailKey as (right(('00000' + cast(IntEmployeeDetailKey as varchar(10)), 5)
然后SQLServer将自动执行递增操作。您可以将该值作为零填充字符串输出。如果您喜欢不更改表结构的解决方案,则:
选择CAST('00003'作为int)
这将返回整数值3MAX()
,如
从mytable中选择MAX(CAST(mycolumn为int))
实际上,您不必进行转换,因为SQLServer将在原始字符串表示中正确排序值从mytable中选择MAX(CAST(mycolumn作为int))+1
从mytable中选择格式(MAX(CAST(mycolumn作为int))+1,'00000'
如果您只有SQL Server 2005或2008可用,则可以结合使用REPLICATE()
和LEN()
来获取所需内容(免责声明:丑陋的代码):
从mytable中选择REPLICATE('0',5-LEN(MAX(CAST(mycolumn AS int))+1))+CAST(MAX(CAST(mycolumn AS int))+1)作为nvarchar(5))
编辑正如Luaan所暗示的,您可以使用另一个填充选项(更短、更可读的代码):
从mytable中选择RIGHT('00000'+CAST(MAX(CAST(mycolumn作为int)+1)作为nvarchar(5)),5)
我不知道
EmployeeDetailKey
是否必须具有此格式
我建议您将数据类型从varchar(10)
替换为IDENTITY
IDENTITY
是一种特殊的数据类型,每次在父表中插入行时,SQL Server都会自动递增该数据类型。您可以在此处了解更多信息:
如果您需要用前导零来表示它,您可以像这样选择它(从这里自由地改编:):
该列不能是标识类型。这是我的一个限制:(.是否允许/允许间隙?当(而不是“如果”、“何时”)时会发生什么)将删除一行?sql server的哪个版本?是否允许更改列类型并使用数字数据类型?是否允许空白。例如,当员工离开组织时,该员工详细信息将被删除,但当需要添加员工详细信息时,必须遵循一个序列。我拥有的版本是sql server 2008。如果他最后一次添加的员工离开公司?简单的“+1”方法会再次使用相同的数字…非常危险…那么序列有什么用呢?带间隙和删除它没有附加值。为什么不使用
GUID
或任何其他更容易管理的随机ID?在2012年之前有一种更好的方法-对吗('00000'+value,5)
。我不知道任何性能影响(这对我来说从来都不是瓶颈),但我们正在为自动增量进行可序列化的更新,所以…@Luaan:太好了,我在答案中包含了该解决方案
SELECT right('00000'+ rtrim(EmployeeDetailKey), 5) FROM YourTable