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

CREATE FUNCTION [dbo].[fn_GetSubGroupInfoById]
(
@id AS INT --某分组Id
)
RETURNS @SubGroups TABLE
(
[GroupId] INT,
[ParentGroupId] INT,
[Level] INT
)
AS
BEGIN
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
RETURN
END
GO

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

CREATE FUNCTION [dbo].[fn_GetSubGroupInfoByIds]
(
@ids AS NVARCHAR(256) --逗号分割的分组Id
)
RETURNS @RetIds TABLE
(
[GroupId] INT
)
AS
BEGIN
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 RETURN
END
GO

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

——获取数组长度:

CREATE FUNCTION [dbo].[fn_str_GetArrayLength]
(
@str NVARCHAR(1024), --要分割的字符串
@split NVARCHAR(10) --分隔符号
)
RETURNS INT
AS
BEGIN
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 @length
END
GO

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

CREATE FUNCTION [dbo].[fn_str_GetFromArrayByIndex]
(
@str NVARCHAR(1024), --要分割的字符串
@split NVARCHAR(10), --分隔符号
@index INT --取第几个元素
)
RETURNS NVARCHAR(1024)
AS
BEGIN
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)
END
GO

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

CREATE PROCEDURE [dbo].[sp_DeleteSubGroupById]
@ids NVARCHAR(256) --逗号分割的分组Id
AS
BEGIN
DELETE FROM [dbo].[tbl_sysGroup]
WHERE [GroupId] in
(
SELECT [GroupId]
FROM [dbo].[fn_GetSubGroupInfoByIds](@ids)
)
RETURN @@ROWCOUNT
END
GO

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

SQL SERVER树形结构数据——批量删除分组数据的更多相关文章

  1. sql server存储过程实现批量删除

    在项目中用到了存储过程来进行批量删除的操作,给大家分享一下 原理就是把id组成的字符串在数据库分割成数组放一张临时表,删除的时候与id进行对照 --删除会员信息 if OBJECT_ID('pro_D ...

  2. SQL Server对数据进行删除

    SQL Server对数据进行删除,把页面的信息从数据库删除. auto"> <tr style="background:red"> <td> ...

  3. sql server 使用SqlBulkCopy批量插入数据库

    sql server sqlbulkcopy 批量数据插入数据库使用的是System.Data.SqlClient中的 SqlBulkCopy批量数据插入数据库 sql server 使用SqlBul ...

  4. 【SQL Server性能优化】删除大量数据的方法比较

    原文:[SQL Server性能优化]删除大量数据的方法比较 如果你要删除表中的大量数据,这个大量一般是指删除大于10%的记录,那么如何删除,效率才会比较高呢? 而如何删除才会对系统的影响相对较小呢? ...

  5. sql Server如何执行批量插入和批量删除

    平时我们sql server执行查询语句都是通过 insert into 表名(字段名,字段名) values(插入值,插入值) --单条插入语句--- insert into Reader(read ...

  6. [SQL Server]树形结构的创建

    对于SQL Server来说,构建显示一个树形结构不是一件容易的事情,逻辑构造能力不是它的强项.不过也不是说它没有能力干这个事情,只要换一种思维方式就可以理解它的工作原理. 例如,现在有一张表的内容如 ...

  7. SQL Server Bulk Insert批量数据导入

    SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快.远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP ...

  8. SQL Server 触发器创建、删除、修改、查看示例

    一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...

  9. SQL server 分离数据库与删除数据库的区别

    今天,在sql server 中,分离数据库,然后就问了一下,与删除数据库的区别 区别在于(百度一下): 分离后,.mdb和.log文件都在,以后你需要用的时候,还可以用附加数据库的方法加上去,分离数 ...

随机推荐

  1. mybatis如何根据mapper接口生成其实现类(springboot)

    序 mybatis里头给sqlSession指定执行哪条sql的时候,有两种方式,一种是写mapper的xml的namespace+statementId,如下: public Student fin ...

  2. iOS new 和 alloc的区别

    一般如果只是 alloc init 那么 用new 是一样的 SomeObject*myObject =[[SomeObject alloc] init]; SomeObject*myObject = ...

  3. windows下npm默认的全局路径

    C:\Users\用户名\AppData\Roaming\npm\node_modules

  4. red5源代码编译并打包公布

    编译环境:ubuntu14.04/JDK7 步骤: 1.svn检出源代码(两种方式) svn co --depth empty https://github.com/Red5/red5-server ...

  5. git server

    选择Git服务器部署策略 找了一圈,发现如下方法来架设Git服务器: Git Candy:http://github.com/Aimeast/GitCandy/ AE大神的作品, Git Candy© ...

  6. linux上传下载文件rz,sz

    [一般用于SecureCRT ssh中使用] █ 法一:直接用yum安装lrzsz(推荐) yum install lrzsz -y 注意:rhel安装完系统后 直接可使用 rz sz █ 法二:源文 ...

  7. loadrunner中log的使用初步总结

    1.log的设置方式 . 在 runtime setting中可以设置log的生成方式: 默认的log方式: Enable logging选中,log option是Send messages onl ...

  8. iOS 图片部分模糊,类似于美图秀秀

    代码地址如下:http://www.demodashi.com/demo/14277.html 演示效果 演示效果 代码结构 项目结构截图如下: 该模块的核心源码部分为 MBPartBlurView, ...

  9. 在Ubuntu上安装Mono

    在Ubuntu上安装Mono 执行以下代码授权注冊repo源并更新软件列表: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ...

  10. php替换str_replace的使用方法,支持多个替换

    废话不多说,直接上代码: str_replace(['a','b','c'],'a',$str);//a或b或c都替换成a str_replace(['a','b','c'],['d','e','f' ...