根据用户输入值增加表中的列

Posted

技术标签:

【中文标题】根据用户输入值增加表中的列【英文标题】:increment a column in the table based on user input values 【发布时间】:2022-01-07 02:53:12 【问题描述】:

我正在尝试编写一个存储过程,每次将任一国家/地区代码(AXX、XPP、CGG)作为用户输入时,都会将表中的一列增加 1,具体取决于已经存在的国家/地区代码价值

ID  CountryCode
1   AXX
2   AXX
1   XPP
3   AXX
4   AXX
2   XPP

我下面的代码获取一个读取 ID 的值

ID
1
2
3
4
...
...
Create procedure [dbo].[sp_Incremental]
@code varchar(50)
as
begin
    declare @IDbigint
    set @ID= 1 ;
    begin try
        Select @ID=count(ID)+1 from [Incremental_tbl]
        Begin
            Insert into [Incremental_tbl] values (@ID,@code)    
        End
end
go

【问题讨论】:

仅供参考,前缀 sp_ 由 Microsoft 保留,用于 Special / S系统 Procedures。它应该用于用户过程。这样做会带来性能成本和您的程序在更新/升级后一天无法工作的风险。要么使用不同的前缀,要么(可能更好)根本不使用前缀。 Is the sp_ prefix still a no-no? 这感觉就像XY Problem。为什么不只使用IDENTITYSEQUENCE 再次投票赞成不重新发明***。使用 IDENTITY 或 SEQUENCE 可以很好地完成这项工作。并且那些已经处理了所有真正具有挑战性的并发边缘情况,以及因错误而带来的所有痛苦。 嗯......这并没有真正起作用.. ID 预计不会按顺序显示.. 而 ID 应该像 ID CODE 1 UK 2 UK 1 EU 2 EU 3 EU 3英国 它会在用户输入时依次递增单独的“CountryCode” 任何其他反馈!? 【参考方案1】:

你可以使用这个SP:

CREATE PROCEDURE p_Incremental @code VARCHAR(50)
AS
SET NOCOUNT ON;
INSERT INTO Incremental_tbl (ID, code) 
SELECT COALESCE(MAX(ID), 0) + 1, @code
FROM   Incremental_tbl
GROUP  BY @code;
GO

但是,不要忘记,在并发访问中,ID 可能会出现相同的值!

【讨论】:

我真的建议在这里使用显式锁,如果这是你要失败的解决方案。 @larnu 最好使用序列化隔离级别而不是显式锁定

以上是关于根据用户输入值增加表中的列的主要内容,如果未能解决你的问题,请参考以下文章

如何根据作为输入的列表正确排序 QTreeView 中的列

如何修改链表中的用户输入?

jquery根据选择值从表中填充文本输入

如何根据用户输入从 SQL 表中删除项目?

hmac

在 MySQL 表中搜索包含 CSV 数据的列中是不是存在输入值