如何将 nvarchar 值增加 1
How to increment nvarchar value by 1
我有一个table对用户信息的修改进行归档,其中主键是一个userid+具体用户信息下次修改的增量号。即用户 1234 的第一个密钥是 1234+000,随后对该用户信息的更改将在存档 table(用户 1234 的下一行)中显示为 1234+001。
所以我已经有了 table dbo.userchanges 用户 1234 的以下信息:
userkey, userid, usercntxt, usergroup
1234+000, 1234, lms, _default
1234+001, 1234, lms, _general_use
如果发现用户的userctxt变为'ils'则下一行为:
1234+002, 1234, ils, _general_use
我的问题是,我如何使用 TSQL 为该用户插入行 1234+002,或者如果 table 已经有 1234+00n,我通常如何插入 1234+00n+1?
如果字符串始终由 8 个字符组成,最后的 3 位数字要递增,那么您可以这样做:
left(userkey, 5) + format(convert(int, right(userkey, 3)) + 1, '00#')
想法是提取最后 3 个字符,转换为数字,递增,然后格式化回可能带有前导零的三位数字。
如果您希望 insert
查询通过“递增”其最后一个已知密钥来生成用户密钥,则:
insert into userchanges (userkey, userid, usercntxt, usergroup)
select coalesce(k.userkey, v.userid + '#000'), v.*
from (values (@userid, @usercntxt, @usergroup)) as v(userkey, userid, usercntxt, usergroup)
outer apply (
select top (1) left(userkey, 5) + format(convert(int, right(userkey, 3)) + 1, '00#') userkey
from userchanges u
where u.userid = v.userid
order by u.userkey desc
) k
如果用户在 table 中还没有行,则会生成一个新键,从索引 000
开始。
我有一个table对用户信息的修改进行归档,其中主键是一个userid+具体用户信息下次修改的增量号。即用户 1234 的第一个密钥是 1234+000,随后对该用户信息的更改将在存档 table(用户 1234 的下一行)中显示为 1234+001。
所以我已经有了 table dbo.userchanges 用户 1234 的以下信息:
userkey, userid, usercntxt, usergroup
1234+000, 1234, lms, _default
1234+001, 1234, lms, _general_use
如果发现用户的userctxt变为'ils'则下一行为:
1234+002, 1234, ils, _general_use
我的问题是,我如何使用 TSQL 为该用户插入行 1234+002,或者如果 table 已经有 1234+00n,我通常如何插入 1234+00n+1?
如果字符串始终由 8 个字符组成,最后的 3 位数字要递增,那么您可以这样做:
left(userkey, 5) + format(convert(int, right(userkey, 3)) + 1, '00#')
想法是提取最后 3 个字符,转换为数字,递增,然后格式化回可能带有前导零的三位数字。
如果您希望 insert
查询通过“递增”其最后一个已知密钥来生成用户密钥,则:
insert into userchanges (userkey, userid, usercntxt, usergroup)
select coalesce(k.userkey, v.userid + '#000'), v.*
from (values (@userid, @usercntxt, @usergroup)) as v(userkey, userid, usercntxt, usergroup)
outer apply (
select top (1) left(userkey, 5) + format(convert(int, right(userkey, 3)) + 1, '00#') userkey
from userchanges u
where u.userid = v.userid
order by u.userkey desc
) k
如果用户在 table 中还没有行,则会生成一个新键,从索引 000
开始。