Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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
Reg:自动递增SQL表中的值_Sql_Sql Server_Auto Increment - Fatal编程技术网

Reg:自动递增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。稍后在插入之后

我在一个名为it(EmployeeDetailKey-varchar(10))的字段中得到一个值,该值具有如下顺序值

000010000200003

它位于Employeedetail表中。当需要插入新的员工详细信息时,我必须获取最大值(EmployeeDetailKey)并按1递增,然后将其存储回去。如果我有10个需要插入的employeedetail记录,则必须遵循相同的步骤

如果最大值(EmployeeDetailKey)=00003,则在插入10条记录后 必须是00013。稍后在插入之后,让我们假设它必须插入100条记录 是00113

我怎样才能以MS-SQL语句的形式完成它


请注意,该列不能是标识类型。

只需将标识列添加到表中即可。我想提出如下建议:

IntEmployeeDetailKey int not null identity(1, 1) primary key,
. . .
然后添加一个计算列:

EmployeeDetailKey as (right(('00000' + cast(IntEmployeeDetailKey as varchar(10)), 5)

然后SQLServer将自动执行递增操作。您可以将该值作为零填充字符串输出。

如果您喜欢不更改表结构的解决方案,则:

  • 将零填充字符串值强制转换为int。这在SQl server中很容易,因为它可以轻松地将此类字符串转换为数字:

    选择CAST('00003'作为int)

    这将返回整数值3

  • 查找最大值()

    只需对刚转换为字符串的列执行
    MAX()
    ,如

    从mytable中选择MAX(CAST(mycolumn为int))

    实际上,您不必进行转换,因为SQLServer将在原始字符串表示中正确排序值

  • 增量

    这很简单,因为现在有了整数值,所以

    从mytable中选择MAX(CAST(mycolumn作为int))+1

  • 将其转换回零填充字符串

    SQLServer2008在这里有点棘手,因为左填充不是他的专长。但是,从SQL Server 2012开始,有一个可用的格式函数,因此,您可以使用

    从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