学习 一个简单的业务处理

需求1:

  “zhuanti8”表 和 “zl_xl”表 是多对多的关系

  “zhuanti8”表:可以理解为文章表

  “zl_xl”表:可以理解成分类表

 表:

CREATE TABLE [dbo].[zhuanti8](
    [xzID] [int] NULL,
    [zlxID] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

CREATE TABLE [dbo].[zl_xl](
    [zlxlID] [int] NULL,
    [zxID] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
View Code

相应的SQL:

--处理数据
DECLARE @zlxlID INT;--int格式
DECLARE @strZlxlID NVARCHAR(MAX);--字符串格式
SET @zlxlID=16;
SET @strZlxlID=CONVERT(NVARCHAR(MAX),@zlxlID);
update dbo.zl_xl
set zxID=
(
 --将select查询结果,生成一个xml形式的字符串 
 select CONVERT(NVARCHAR(MAX),xzID)+',' from  
 (
  --找到包含16的数据 并 去重
  select distinct xzID from dbo.zhuanti8 where zlxID like '%,'+@strZlxlID+',%'
 ) t
 where 1=1 for xml path('')
)
where zlxlID=@zlxlID
View Code

需求2:还是上面的表结构,“zhuanti8”表每次新增数据时,自动完成“zl_xl”表的处理。

--过程:
--1、zhuanti8表,在insert时,激活触发器,得到字段zlxID的值
--2、将该字段zlxID的值,按‘,’来拆分字符,然后遍历拆分后的字符串
--3、对遍历的每个字符串进行处理




--3、处理数据 参数@zlxlID
CREATE PROC proc_zl_xl_update_zxID
@zlxlID INT--int格式
AS
BEGIN    
    --DECLARE @zlxlID INT;--int格式
    DECLARE @strZlxlID NVARCHAR(MAX);--字符串格式
    --SET @zlxlID=16;
    SET @strZlxlID=CONVERT(NVARCHAR(MAX),@zlxlID);
    UPDATE dbo.zl_xl
    SET zxID=
    (
     --将select查询结果,生成一个xml形式的字符串 
     SELECT CONVERT(NVARCHAR(MAX),xzID)+',' FROM  
     (
      --找到包含16的数据 并 去重
      SELECT DISTINCT xzID FROM dbo.zhuanti8 WHERE zlxID LIKE '%,'+@strZlxlID+',%'
     ) T
     WHERE 1=1 FOR XML PATH('')
    )
    WHERE zlxlID=@zlxlID    
END
GO






--2、拆分遍历 参数:@xzID,@zlxID
--过程:将字符串 ',16,18,' 按‘,’来拆分字符,遍历拆分后的字符串处理

CREATE PROC proc_zhuanti8_select_zlxID
@xzID INT,
@zlxID NVARCHAR(MAX)
AS
BEGIN
    
    DECLARE @location INT;  --定义起始位置
    DECLARE @start INT;     --定义从第几个开始
    DECLARE @length INT;    --定义变量,用于接收计算元素的个数
        
    DECLARE @originalStr NVARCHAR(MAX);        --要分割的字符串
    DECLARE @split       NVARCHAR(MAX)        --分隔符号
    DECLARE @res_str_zxID INT;  
    DECLARE @res_int_zxID INT;
    
    SET @originalStr = @zlxID;--赋值
    SET @split = ',';  
    --SET @originalStr = @originalStr + @split;--最后一个元素是‘,’ 所以这里不需要加了
    SET @originalStr = SUBSTRING(@originalStr,2,LEN(@originalStr)-1);   
    SET @start=0;
    
    SET @originalStr = LTRIM(RTRIM(@originalStr));    --去除字符串左右两侧的空格    
    SET @location = CHARINDEX(@split, @originalStr);  --分割符号在字符串中第一次出现的位置(索引从1开始计数)    
    SET @length = 1;
    
    WHILE @location <> 0
    BEGIN
        --正在遍历的每个 拆分后的字符串
        SET @res_str_zxID=SUBSTRING(@originalStr, @start, @location -@start);
        SET @res_int_zxID=CONVERT(INT, @res_str_zxID);        
        
        --调用存储过程 处理数据
        EXEC proc_zl_xl_update_zxID @res_int_zxID;
        
        SET @start = @location + 1;
        SET @location = CHARINDEX(@split, @originalStr, @start);                
        SET @length = @length + 1;        
    END    
END
GO




--1、创建触发器
CREATE TRIGGER trig_zhuanti8_insert_after --创建触发器名称
ON zhuanti8--用于哪张表
AFTER INSERT--在插入数据之后做的动作
AS
    DECLARE @xzID INT;
    DECLARE @zlxID NVARCHAR(MAX);
    SELECT @xzID=xzID FROM INSERTED;
    SELECT @zlxID=zlxID FROM INSERTED;
    
    --调用存储过程 拆分遍历
    EXEC proc_zhuanti8_select_zlxID 15128,',16,18,' 
GO
View Code
--局部测试SQL
SELECT * FROM dbo.zl_xl
SELECT * FROM dbo.zhuanti8
update dbo.zl_xl set zxID=''
exec proc_zl_xl_update_zxID 16  
exec proc_zhuanti8_select_zlxID 15128,',16,18,'  
View Code
原文地址:https://www.cnblogs.com/guxingy/p/11865115.html