--自动分组方案
--1. 原始表,需处理的数据
1 CREATE TABLE tbl_Z_Original 2 ( 3 nID bigint identity(1,1) primary key, 4 sPro nvarchar(20), 5 sProBarcode nvarchar(20), 6 dDate datetime default getdate() 7 )
--2. 计数器,记录分组号
--2.1. 创建表
1 CREATE TABLE tbl_Z_Counter 2 ( 3 nID int identity(1,1) primary key, 4 sName nvarchar(50), 5 nCount bigint 6 )
--2.2. 插入测试数据
1 INSERT INTO tbl_Z_Counter(sName,nCount) 2 VALUES('A',1), 3 ('B',1), 4 ('C',1);
--3. 自动分组表,记录分组后的信息
1 CREATE TABLE tbl_Z_Groups 2 ( 3 gid UNIQUEIDENTIFIER PRIMARY KEY, 4 nID BIGINT, --记录原始表【tbl_Z_Original】中的“nID” 5 sPro NVARCHAR(20), --记录原始表【tbl_Z_Original】中的“sPro” 6 nGroups BIGINT, --分组号,获取计数器【tbl_Z_Counter】中的“nCount” 7 sProBarcode NVARCHAR(20), --记录原始表【tbl_Z_Original】中的“sProBarcode” 8 dDate DATETIME --记录原始表【tbl_Z_Original】中的“dDate” 9 )
--4. 自动控制器,控制启动与停止分组
--4.1. 创建表
1 CREATE TABLE tbl_Z_Controller 2 ( 3 gid UNIQUEIDENTIFIER PRIMARY KEY, 4 sPro nvarchar(20), 5 bStartOrStop BIT DEFAULT 0, 6 bCol1 BIT DEFAULT 0, 7 bCol2 BIT DEFAULT 0, 8 bCol3 BIT DEFAULT 0 9 )
--4.2. 插入测试数据
INSERT INTO tbl_Z_Controller(gid,sPro,bStartOrStop) VALUES(NEWID(),'A',1), (NEWID(),'B',0), (NEWID(),'C',1);
--5. 计数规则表,计数循环设置
--5.1. 创建表
1 CREATE TABLE tbl_Z_CountingRules 2 ( 3 gid UNIQUEIDENTIFIER PRIMARY KEY, 4 sPro NVARCHAR(20), 5 nCountingRules INT 6 )
--5.2. 插入测试数据
1 INSERT INTO tbl_Z_CountingRules 2 VALUES(NEWID(),'A',12), 3 (NEWID(),'B',10), 4 (NEWID(),'C',5);
--6. 触发器处理
-- 在原始表中创建触发器,每增加一条记录,根据要求自动分组并记录到自动分组表中
1 -- 在原始表中创建触发器,每增加一条记录,根据要求自动分组并记录到自动分组表中 2 CREATE TRIGGER [dbo].[tri_insert_tbl_Z_Groups] 3 ON [dbo].[tbl_Z_Original] 4 AFTER INSERT 5 AS 6 BEGIN 7 DECLARE @bStartOrStop BIT 8 DECLARE @isExit BIT 9 10 DECLARE @sPro NVARCHAR(20) 11 SELECT @sPro=sPro FROM inserted --获取当前插入的是哪个编号 12 13 SELECT @bStartOrStop= bStartOrStop FROM tbl_Z_Controller WHERE sPro=@sPro 14 SELECT @isExit=CASE WHEN SUBSTRING(sProBarcode,1,3)='SSS' 15 THEN 1 ELSE 0 END FROM inserted --判断是否是合理的数据,示例以“SSS”开头的字符串视为合理数据 16 17 IF @bStartOrStop=1 AND @isExit=1 18 BEGIN 19 20 DECLARE @x INT 21 DECLARE @nCountingRules INT --循环计数界限 22 DECLARE @nCount AS INT 23 24 SELECT @nCountingRules=nCountingRules FROM tbl_Z_CountingRules WHERE sPro=@sPro 25 SELECT @nCount=nCount FROM tbl_Z_Counter WHERE sName=@sPro 26 27 28 SELECT @x=COUNT(*) FROM tbl_Z_Groups WITH(NOLOCK) 29 WHERE nGroups=@nCount AND sPro=@sPro 30 31 32 IF @x >= @nCountingRules-1 --分组界限 33 BEGIN 34 UPDATE tbl_Z_Counter 35 SET nCount = @nCount + 1 36 FROM tbl_Z_Counter 37 WHERE sName=@sPro 38 END 39 40 INSERT INTO tbl_Z_Groups 41 SELECT NEWID(),nID,sPro,@nCount,sProBarcode,dDate FROM inserted 42 END 43 END
当后台有原始表插入记录时,自动分组表获取相应信息,演示结果如下: