需求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
相应的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
需求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
--局部测试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,'