1 创建MaxIdProcess表,由于存储ID的最大值

CREATE TABLE [dbo].[MaxIdProcess](
[Id] [bigint] IDENTITY(1,1) NOT NULL, --自增ID
[TableNM] [nvarchar](200) NOT NULL, --存储表明
[Prefix] [nvarchar](50) NULL, --ID前缀
[Radix] [char](2) NULL, --
[MaxId] [nvarchar](50) NULL, --存储最大ID
[CreateDatetime] [datetime] NULL, --创建时间
[LastModifyDatetime] [datetime] NULL,
[LastModifyBy] [nvarchar](50) NULL,
CONSTRAINT [PK_MaxIdProcess] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

2、创建存储过程 Pro_GetTableNextMaxIdByTableName 获取最大ID

 CREATE procedure [dbo].[Pro_GetTableNextMaxIdByTableName]
@TableName char(50), --table名称
@Prefix char(3), --ID前缀
@NextId char(16) out --ID输出
AS begin
--if not exists (select * from MaxIdProcess where TableName=@TableName)
--begin
-- insert into MaxIdProcess values(@TableName,null)
--end
-- update MaxIdProcess
-- set @NextId= isnull(MaxId, @Prefix + '0000000000001'),
-- MaxId = dbo.Fun_GetMaxId(MaxId,@Prefix)
-- where TableName=@TableName --检查系统表中是否存在该表,如果不存在则调用Pro_GetRandomStr存储过程获取一个随机ID
IF EXISTS (SELECT object_id FROM sys.objects(nolock) WHERE type='U' AND name=@TableName)
BEGIN
EXEC Pro_GetRandomStr @NextId output
RETURN
END --检查MaxIdProcess表中是否存有需要获取ID的表名,如果不存在则插入数据
if not exists (select * from MaxIdProcess where TableNM=rtrim(@TableName))
begin
insert into MaxIdProcess values(@TableName,@Prefix,'',0,getdate(),getdate(),'Auto')
end declare @temp bigint
update MaxIdProcess
set @temp=cast(rtrim(MaxId) as bigint),MaxId=MaxId+1
where rtrim(TableNM)=rtrim(@TableName)
set @NextId=@Prefix+right(cast(1000000000000000+@temp as nvarchar(16)),13)
end

3、创建执行存储过程,如插入新增用户

CREATE PROCEDURE [dbo].[Pro_User_Insert]
@UserId CHAR(16) OUT ,
@UserNM NVARCHAR(50) ,
@Description NVARCHAR(255)
AS BEGIN TRY
BEGIN
DECLARE @Name NVARCHAR(50);
SELECT @UserId = UsersTb.UserId ,
@Name = UsersTb.Description
FROM dbo.UsersTb
WHERE UsersTb.UserNM = @UserNM;
IF NOT ISNULL(@UserId, '') = ''
BEGIN
SELECT @UserNM + @Name + '已经存在';
--SELECT '用户已经存在';
RETURN;
END;
DECLARE @MaxId CHAR(16);
EXEC dbo.GetTableNextMaxIdByTableName 'User', 'Usr', @MaxId OUT;
SET @UserId = @MaxId; INSERT INTO UsersTb
(
[UserId] ,
[UserNM] ,
[Description]
)
VALUES
(
@UserId ,
@UserNM,
@Description
);
SELECT '执行成功';
END
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE();
END CATCH

4、执行新增用户存储过程

DECLARE @UserId int;
EXEC Pro_User_Insert @UserId output,'zhangsan','张三' ;

5、完成

关于 Pro_GetRandomStr 存储过程

CREATE Procedure [dbo].[Pro_GetRandomStr]
@RandomStr varchar(16) output
as
BEGIN
set nocount on declare @s varchar(61)
declare @r varchar(16)
declare @pos int
declare @len int
set @s = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678'
set @len = len(@s);
set @r = ''
while len(@r) < 16
begin
set @pos = cast(rand()*61 as int);
--while @pos > @len or @pos <1
--begin
-- if(@pos < 1)
-- set @pos = cast(rand()*61 as int);
-- else
-- set @pos = cast(@pos /2 as int);
--end
set @r = @r + substring(@s, @pos, 1)
--select @r
end
set @RandomStr = upper(@r)
END

c# 实现存储过程

string strcon = "Data Source=(local)\\SQLEXPRESS; Initial Catalog=TestDatabase; ";
strcon += "Integrated Security=True;";
using (SqlConnection con = new SqlConnection(strcon))
{
con.Open();
SqlParameter[] parameters =
{
new SqlParameter("@UserId", SqlDbType.Char,),
new SqlParameter("@UserNM", SqlDbType.NVarChar),
new SqlParameter("@Description", SqlDbType.NVarChar),
}; //parameters[0].Value = null;
parameters[].Direction = ParameterDirection.Output;
parameters[].Value = "zhangsan";
parameters[].Value = "张三"; SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Pro_User_Insert";
cmd.Connection = con;
cmd.Parameters.AddRange(parameters);
object obj = cmd.ExecuteScalar();
//string msg = cmd.ExecuteScalar().ToString();
con.Close(); }

SQL处理数据并发,解决ID自增的更多相关文章

  1. sql Server插不进数据,以及Id自增的教程及注意事项

    参考于:https://jingyan.baidu.com/article/fec4bce244f902f2608d8b7a.html 使用SQL Server 2014 数据库做web的项目出现错误 ...

  2. sql 删除表数据并使ID自增重置

    方法1:truncate table 你的表名//这样不但将数据全部删除,而且重新定位自增的字段 方法2:delete from 你的表名dbcc checkident(你的表名,reseed,0)  ...

  3. 2016.6.11 ASP提交数据到SQL server数据乱码解决方法

    1.检查数据库排序规则 China-PRE-90-CS-AI 2.ASP文档中,写入数据的页面的编码和检查提交数据页面的编码一致:

  4. oracle 新增一条数据时设置id自增

    CREATE SEQUENCE test_seq    --创建一个test_seq序列INCREMENT BY 1   --每次加1START WITH 1     --从1开始NOMAXVALUE ...

  5. mysql实现id自增

    用下面这句话就可以实现插入mysql数据时候实现id自增 create table shuju (id int(10) auto_increment primary key,name varchar( ...

  6. 解决在mysql表中删除自增id数据后,再添加数据时,id不会自增1的问题

    https://blog.csdn.net/shaojunbo24/article/details/50036859 问题:mysql表中删除自增id数据后,再添加数据时,id不会紧接.比如:自增id ...

  7. SQL Server中Id自增列的最大Id是多少

    什么是自增列 在SQL Server中可以将Id列设为自增.即无需为Id指定值,由SQL Server自动给该列赋值,每新增一列Id的值加一,初始值为1. 需要注意的是即使将原先添加的所有数据都删除, ...

  8. [SQL]SQL Server数据表的基础知识与增查删改

    SQL Server数据表的基础知识与增查删改 由张晨辉(学生) 于19天 前发表 | 阅读94次 一.常用数据类型 .整型:bigint.int.smallint.tinyint .小数:decim ...

  9. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

随机推荐

  1. UVa 10763 Foreign Exchange(map)

    Your non-profitorganization (iCORE - international Confederationof Revolver Enthusiasts) coordinates ...

  2. 19-Javaweb项目读取本地图片通过虚拟路径

    有时会把文件存在本地如将图片等放在c.d盘等,在javaweb引用时会出现无法直接访问的问题,但是还是有办法解决的. 可以通过配置虚拟路径: 步骤一: 双击servers下面的tomcat, 在弹出的 ...

  3. Linq和EF 做 单一条件查询 和 复合条件 查询 以及 多表 联合查询 示例

    单一条件查询: var table2Object = (from t1 in db.table1 join t2 in db.table2 on t1.id equals t2.id select t ...

  4. HHvm建站环境搭建方法:Nginx,Mariadb,hhvm及lnmp/lamp安装部署

    HHVM起源于Facebook公司,是一个开源的PHP虚拟机,使用JIT的编译方式以及其他技术,让PHP代码的执行性能大幅提升.HHVM提升PHP性能的途径,采用的方式就是替代Zend引擎来生成和执行 ...

  5. 中介者模式(QQ聊天室我觉得是个很生动的例子简单易懂)

    设计模式之中介者模式(Mediator) 一.初识中介者模式 那些年,我们一起上过的大学,班级里有班长,有团书记.想一想如果没有QQ这种通讯工具的话,那么班长或者团支书该怎样下达消息呢??同时,班级上 ...

  6. 2018.10.19 NOIP模拟 加密(模拟)

    传送门 直接按hashhashhash函数反着算回去就行了. 加法用exgcdexgcdexgcd,异或直接枚举二进制位. 代码

  7. DB2 runstats、reorgchk、reorg 命令【转载】

    1.runstats runsats可以搜集表的信息,也可以搜集索引信息.作为runstats本身没有优化的功能,但是它更新了统计信息以后,可以让DB2优化器使用最新的统计信息来进行优化,这样优化的效 ...

  8. spring+hibernate 整合异常 Class 'org.apache.commons.dbcp.BasicDataSource' not found

    解决方法 添加 commons-dbcp.jar和commons-pool.jar包

  9. IntelliJ IDEA 2017版 spring-boot修改端口号配置把端口号改为8081

    1.修改端口号主要是通过配置文件修改.如图: 完整版配置 ######################################################## ###server 配置信息 ...

  10. cmake-mark_as_advanced

    mark_as_advanced: Mark cmake cached variables as advanced. mark_as_advanced([CLEAR|FORCE] VAR VAR2 V ...