Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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 如何将nvarchar值增加1_Sql_Sql Server_String_Tsql_Sql Insert - Fatal编程技术网

Sql 如何将nvarchar值增加1

Sql 如何将nvarchar值增加1,sql,sql-server,string,tsql,sql-insert,Sql,Sql Server,String,Tsql,Sql Insert,我有一个表来归档对用户信息的更改,其中主键是userid+对特定用户信息的下一次更改的增量数。i、 e用户1234的第一个键是1234+000,对该用户信息的后续更改将作为1234+001显示在存档表(用户1234的下一行)中 因此,表dbo.userchanges已经包含用户1234的以下信息: userkey, userid, usercntxt, usergroup 1234+000, 1234, lms, _default 1234+001, 1234, lms, _general_us

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

因此,表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行?

如果字符串始终由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

开始。如果字符串始终由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
开始。。。好的古老的“智能代码”。它们在80年代很流行。老实说,我建议避开这种设计。它非常死板,最终会在业务逻辑中添加许多不必要的低级逻辑。他们只是让事情变得复杂。使用复合键,例如(user,datetime)或类似的。哦。。。好的古老的“智能代码”。它们在80年代很流行。老实说,我建议避开这种设计。它非常死板,最终会在业务逻辑中添加许多不必要的低级逻辑。他们只是让事情变得复杂。改为使用复合键,如(user、datetime)或类似键。