-
sql语句大全之SQL处理数据并发,解决ID自增
创建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
1 CREATE procedure [dbo].[Pro_GetTableNextMaxIdByTableName] 2 @TableName char(50), --table名称 3 @Prefix char(3), --ID前缀 4 @NextId char(16) out --ID输出 5 AS 6 7 begin 8 --if not exists (select * from MaxIdProcess where TableName=@TableName) 9 --begin 10 -- insert into MaxIdProcess values(@TableName,null) 11 --end 12 -- update MaxIdProcess 13 -- set @NextId= isnull(MaxId, @Prefix + '0000000000001'), 14 -- MaxId = dbo.Fun_GetMaxId(MaxId,@Prefix) 15 -- where TableName=@TableName 16 17 18 --检查系统表中是否存在该表,如果不存在则调用Pro_GetRandomStr存储过程获取一个随机ID 19 IF EXISTS (SELECT object_id FROM sys.objects(nolock) WHERE type='U' AND name=@TableName) 20 BEGIN 21 EXEC Pro_GetRandomStr @NextId output 22 RETURN 23 END 24 25 --检查MaxIdProcess表中是否存有需要获取ID的表名,如果不存在则插入数据 26 if not exists (select * from MaxIdProcess where TableNM=rtrim(@TableName)) 27 begin 28 insert into MaxIdProcess values(@TableName,@Prefix,'10',0,getdate(),getdate(),'Auto') 29 end 30 31 declare @temp bigint 32 update MaxIdProcess 33 set @temp=cast(rtrim(MaxId) as bigint),MaxId=MaxId+1 34 where rtrim(TableNM)=rtrim(@TableName) 35 set @NextId=@Prefix+right(cast(1000000000000000+@temp as nvarchar(16)),13) 36 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,16), new SqlParameter("@UserNM", SqlDbType.NVarChar), new SqlParameter("@Description", SqlDbType.NVarChar), }; //parameters[0].Value = null; parameters[0].Direction = ParameterDirection.Output; parameters[1].Value = "zhangsan"; parameters[2].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(); }
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式