• 学习 一个简单的业务处理


    需求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
  • 相关阅读:
    字符串匹配算法
    C#中窗体的位置和大小
    关于C#值类型,引用类型,值传递,引用传递(转载)
    ArcMap中设置.mxd相对路径
    统计学上的知识
    .NET 数学实现资料(ZZ)
    牛腩新闻系统学习笔记06讲 编写SQLHelper
    DropDownList 控件不能触发SelectedIndexChanged 事件的另一个原因
    牛腩新闻视频 03讲 数据库设计的心得 如何建立外键sql2008的数据库关系图功能
    使用sql server management studio 2008 连接数据库,无法查看数据库,提示 无法为该请求检索数据 错误916
  • 原文地址:https://www.cnblogs.com/guxingy/p/11865115.html
Copyright © 2020-2023  润新知