SQL SERVER树形结构数据——批量删除分组数据
定义函数获取某结点下所有子结点:
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树形结构数据——批量删除分组数据的更多相关文章
- sql server存储过程实现批量删除
在项目中用到了存储过程来进行批量删除的操作,给大家分享一下 原理就是把id组成的字符串在数据库分割成数组放一张临时表,删除的时候与id进行对照 --删除会员信息 if OBJECT_ID('pro_D ...
- SQL Server对数据进行删除
SQL Server对数据进行删除,把页面的信息从数据库删除. auto"> <tr style="background:red"> <td> ...
- sql server 使用SqlBulkCopy批量插入数据库
sql server sqlbulkcopy 批量数据插入数据库使用的是System.Data.SqlClient中的 SqlBulkCopy批量数据插入数据库 sql server 使用SqlBul ...
- 【SQL Server性能优化】删除大量数据的方法比较
原文:[SQL Server性能优化]删除大量数据的方法比较 如果你要删除表中的大量数据,这个大量一般是指删除大于10%的记录,那么如何删除,效率才会比较高呢? 而如何删除才会对系统的影响相对较小呢? ...
- sql Server如何执行批量插入和批量删除
平时我们sql server执行查询语句都是通过 insert into 表名(字段名,字段名) values(插入值,插入值) --单条插入语句--- insert into Reader(read ...
- [SQL Server]树形结构的创建
对于SQL Server来说,构建显示一个树形结构不是一件容易的事情,逻辑构造能力不是它的强项.不过也不是说它没有能力干这个事情,只要换一种思维方式就可以理解它的工作原理. 例如,现在有一张表的内容如 ...
- SQL Server Bulk Insert批量数据导入
SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快.远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP ...
- SQL Server 触发器创建、删除、修改、查看示例
一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...
- SQL server 分离数据库与删除数据库的区别
今天,在sql server 中,分离数据库,然后就问了一下,与删除数据库的区别 区别在于(百度一下): 分离后,.mdb和.log文件都在,以后你需要用的时候,还可以用附加数据库的方法加上去,分离数 ...
随机推荐
- 【pyhon】理想论坛爬虫1.05版,将读取和写DB分离成两个文件
下午再接再厉仿照Nodejs版的理想帖子爬虫把Python版的也改造了下,但美中不足的是完成任务的线程数量似乎停滞在100个左右,让人郁闷.原因还待查. 先把代码贴出来吧,也算个阶段性成果. 爬虫代码 ...
- ios8 xcode6 下的启动界面设置和图标设置
IOS8 我试了网上不少设置启动动画的,不知道是不是我弄错了还是怎么的,反正启动不了,后来在code4论坛找到了这个: 启动屏幕:LaunchScreen.xib文件 桌面图标等相关app图片:Ima ...
- ubuntu Server 安装 php5
ubuntu Server 安装 php5 1:如果你的服务器已经安装了apache2组件,那么在安装php5时,可以把对应apache2的php5组件一起安装 sudo apt-get instal ...
- UIScrollView 图片循环滚动
1:假如有6个图片:那个,Scrollview的大小加 7 个图片的大小 2: //ImageScrollView; UIScrollView *imageScroll = [[UIScrollVie ...
- uni-app 生命周期
生命周期分为:页面生命周期和应用生命周期 生命周期可参考:uni-app官方API 注意平台支持,仅某个平台支持会显示,5+App是超HTML5+的App方案. 例如分享:只有小程序支持.这时我们就要 ...
- MongodbUtil
import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.MongoClien ...
- HDOJ 4686 Arc of Dream 矩阵高速幂
矩阵高速幂: 依据关系够建矩阵 , 高速幂解决. Arc of Dream Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/ ...
- faster rcnn测试VOC2012的问题
Traceback (most recent call last): File "./tools/test_net.py", line 90, in test_net(net, i ...
- Socket实现服务器与客户端的交互
连接过程: 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. (1)服务器监听:是服务器端套接字并不定位具体的客户端套接 ...
- Python之对象的属性
# -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之对象的属性 #http://python.jobbole.com/82622/ #对象的属性 ...