SQL處理數據併發,解決ID自增

来源:https://www.cnblogs.com/wangyonglai/archive/2018/05/15/9039193.html
-Advertisement-
Play Games

1 創建MaxIdProcess表,由於存儲ID的最大值 2、創建存儲過程 Pro_GetTableNextMaxIdByTableName 獲取最大ID 3、創建執行存儲過程,如插入新增用戶 4、執行新增用戶存儲過程 5、完成 關於 Pro_GetRandomStr 存儲過程 ...


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

 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();
                
            }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Centos 系統安裝 Centos 系統部署Nginx ...
  • "高通display驅動" 0. 關鍵字 MDSS : 高通平臺lcd multimedia Display sub system DSI: Display Serial Interface 1. 涉及文件 1. drivers\video\fbmem.c(核心層) 2. drivers\video ...
  • 環境RHEL7.4 1.搭建伺服器端主機環境 網路配置 網卡eth0 10.0.0.1 網卡eth1 10.1.0.1 網卡eth2 10.2.0.1 網卡eth3 10.3.0.1 硬碟配置 添加一塊100GB硬碟,配置成DATAVG,劃分LV併發布成iscsi硬碟 iscsi target服務配 ...
  • 本文記錄一下,在docker中安裝Mongodb的過程。 環境:物理機 ubuntu18.04 因為環境變了,我在一臺物理機上直接安裝了ubuntu(非虛擬機和雙系統),所以這次又參照在docker中初次體驗.net core 2.0 安裝了一遍docker,但是進行的不是很順利。執行命令:sudo ...
  • 1.關於Ubuntu 安裝完成後界面展示 Ubuntu 是一個南非的民族觀念,著眼於人們之間的忠誠和聯繫。該詞來自於祖魯語和科薩語。Ubuntu(發音"oo-BOON-too"--“烏班圖”) 被視為非洲人的傳統理念,也是建立新南非共和國的基本原則之一,與非洲復興的理想密切相關。 Ubuntu 精神 ...
  • 原因在於 windows 下的換行符是 \r\n,而 linux 下的換行符是 \n 解決方案: 首先運行如下命令安裝 dos2unix: 接下來運行如下命令進行轉換工作: 完成轉換後便可正常執行腳本。 ...
  • lk SPI驅動 1. 初始化時鐘 在lk中,我們是從kmain開始執行下來的,而執行順序則是先初始化時鐘,也就是在 函數中開始執行的: 在這裡我們需要修改這個函數中的 ,我們來這裡看這個函數,平臺為msm8909: 這個數組增加可以參考鏈接來增加,之後會提供patch來顯示,相關寄存器文檔參考 ; ...
  • 無論是什麼晶元里的BootROM,其最核心的功能無非兩個:一、從存放Application的存儲器中載入執行;二、通過支持的通信介面接收來自Host的Application數據完成更新,所以Boot配置也主要圍繞這兩個核心功能。今天痞子衡就來重點聊一聊i.MXRT Boot方式具體由哪些配置決定的。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...