博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL SERVER树形结构数据——批量删除分组数据
阅读量:5339 次
发布时间:2019-06-15

本文共 2941 字,大约阅读时间需要 9 分钟。

定义函数获取某结点下所有子结点:

CREATE FUNCTION [dbo].[fn_GetSubGroupInfoById](    @id AS INT    --某分组Id)RETURNS @SubGroups TABLE(    [GroupId] INT,    [ParentGroupId] INT,    [Level] INT)ASBEGIN     DECLARE @level AS INT        SELECT @level = 0        INSERT INTO @SubGroups    SELECT [GroupId], [ParentGroupId], @level AS [Level]     FROM [tbl_sysGroup]     WHERE [GroupId] = @id    WHILE @@ROWCOUNT > 0     BEGIN        SET @level = @level + 1        INSERT INTO @SubGroups        SELECT G.[GroupId], G.[ParentGroupId], @level AS [Level]        FROM [tbl_sysGroup] AS G JOIN @SubGroups AS S        ON G.[ParentGroupId] = S.[GroupId] AND S.[Level] = @level - 1    END    RETURNENDGO

定义函数利用上面的函数收集要删除的数据:

CREATE FUNCTION [dbo].[fn_GetSubGroupInfoByIds](    @ids AS NVARCHAR(256)    --逗号分割的分组Id)RETURNS @RetIds TABLE(    [GroupId] INT)ASBEGIN     DECLARE @next INT      DECLARE @SubGroups TABLE    (        [GroupId] INT    )    SET @next=1        WHILE @next<=dbo.fn_str_GetArrayLength(@ids,',')    BEGIN        INSERT INTO @SubGroups         SELECT [GroupId]         FROM dbo.fn_GetSubGroupInfoById(dbo.fn_str_GetFromArrayByIndex(@ids,',',@next))        SET @next=@next+1    END    INSERT INTO @RetIds SELECT DISTINCT [GroupId] FROM @SubGroups    RETURNENDGO

因为是要批量删除,但是SQL里没有数组这种数据类型,所以这里利用字符串,把其当作数组来使用,但是需要两个自定义函数:

——获取数组长度:

CREATE FUNCTION [dbo].[fn_str_GetArrayLength](    @str NVARCHAR(1024),    --要分割的字符串    @split NVARCHAR(10)        --分隔符号)RETURNS INTASBEGIN    DECLARE @location INT    DECLARE @start INT    DECLARE @length INT    SET @str=LTRIM(RTRIM(@str))    SET @location=CHARINDEX(@split,@str)    SET @length=1    WHILE @location<>0    BEGIN        SET @start=@location+1        SET @location=CHARINDEX(@split,@str,@start)        SET @length=@length+1    END    RETURN @lengthENDGO

——获取数组某位置的元素:

CREATE FUNCTION [dbo].[fn_str_GetFromArrayByIndex](    @str NVARCHAR(1024),    --要分割的字符串    @split NVARCHAR(10),    --分隔符号    @index INT                --取第几个元素)RETURNS NVARCHAR(1024)ASBEGIN    DECLARE @location INT    DECLARE @start INT    DECLARE @next INT    DECLARE @seed INT    SET @str=LTRIM(RTRIM(@str))    SET @start=1    SET @next=1    SET @seed=LEN(@split)    SET @location=CHARINDEX(@split,@str)    while @location<>0 and @index>@next    BEGIN        SET @start=@location+@seed        SET @location=CHARINDEX(@split,@str,@start)        SET @next=@next+1    END    IF @location =0 SELECT @location =LEN(@str)+1    --这儿存在两种情况:    -- 1、字符串不存在分隔符号     -- 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。    RETURN SUBSTRING(@str,@start,@location-@start)ENDGO

定义存储过程批量删除数据:

CREATE PROCEDURE [dbo].[sp_DeleteSubGroupById]    @ids NVARCHAR(256)    --逗号分割的分组IdASBEGIN    DELETE FROM [dbo].[tbl_sysGroup]     WHERE [GroupId] in     (        SELECT [GroupId]         FROM [dbo].[fn_GetSubGroupInfoByIds](@ids)    )    RETURN @@ROWCOUNTENDGO

这样在EF上添加存储过程后直接传入逗号分割的id字符串就可以批量删除了。返回值是受影响的条数

转载于:https://www.cnblogs.com/xwgli/p/3419703.html

你可能感兴趣的文章
shell cat 合并文件,合并数据库sql文件
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
struts1和struts2的区别
查看>>
Redis常用命令
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
套接口和I/O通信
查看>>
阿里巴巴面试之利用两个int值实现读写锁
查看>>
浅谈性能测试
查看>>
Winform 菜单和工具栏控件
查看>>
CDH版本大数据集群下搭建的Hue详细启动步骤(图文详解)
查看>>
巧用Win+R
查看>>
浅析原生js模仿addclass和removeclass
查看>>
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
YUI3自动加载树实现
查看>>
当心JavaScript奇葩的逗号表达式
查看>>
like tp
查看>>
DCDC(4.5V to 23V -3.3V)
查看>>