【问题标题】:How to increment nvarchar value by 1如何将 nvarchar 值增加 1
【发布时间】:2020-09-04 20:04:25
【问题描述】:

我有一个表来存档对用户信息的更改,其中主键是用户ID + 对特定用户信息的下一次更改的增量数。即用户 1234 的第一个键是 1234+000,随后对该用户信息的更改将在存档表(用户 1234 的下一行)中显示为 1234+001。

所以我已经有了表 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 行,或者如果表已经有 1234+00n,我一般如何插入 1234+00n+1?

【问题讨论】:

  • 哦……好老的“智能代码”。它们在 80 年代很流行。老实说,我建议避开这种设计。它非常死板,最终会在您的业务逻辑中不必要地添加许多低级逻辑。他们只是让事情变得复杂。请改用复合键,例如 (user, datetime) 或类似的。

标签: sql sql-server string tsql sql-insert


【解决方案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

如果用户在表中还没有行,则生成一个新键,从索引000开始。

【讨论】:

    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多