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文件都在,以后你需要用的时候,还可以用附加数据库的方法加上去,分离数 ...
随机推荐
- redis常用命令记录
cd App/opt/redis/bin/ ./redis-cli 1.查看所有key值 keys 前缀* 2.删除指定key值 删除一条 del key全名 删除多条 exit ./redis-cl ...
- 大型应用的javascript架构
来源:http://blog.leezhong.com/tech/2010/11/29/javascript-arch.html 目前很多网站基本没有明确的前端架构,大多是服务端渲染视图页,输出到浏览 ...
- Android 之类库常用包
Android 是由谷歌公司推出的一款基于Linux平台的开源手机操作系统平台. 在Android类库中,各种包写成android.*的方式,重要包的描述如下所示: [1]android.app:提供 ...
- A Package Manager for Xcode -Xcode模板管理工具Alcatraz使用
一款功能强大的Xcode模板管理工具 一:安装之后的效果图 二:安装 1:先关闭 xcode 2: 打开 terminal 3: 复制粘贴运行如下代码 mkdir -p ~/Library/App ...
- linux 目录结构(转)
原文:http://www.centoscn.com/CentOS/2014/1222/4347.html linux 目录结构 /: 根目录,一般根目录下只存放目录,不要存放文件,/etc./bin ...
- Hotaru's problem(hdu5371+Manacher)多校7
Hotaru's problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- RPM 命令大全
RPM 大全RPM 有五种基本的操作方式(不包括创建软件包): 安装, 卸载, 升级, 查询,和验证. 下面我们就来逐一的讲解吧. 一. 安装RPM包 RPM 软件包通常具有类似foo-1.0-1.i ...
- html中title属性换行实现
本文主要讲解titile属性换行的实现方式.<title> 元素可定义文档的标题,可以应用在img.a等标签上. 1.实现方式: <!DOCTYPE html> <htm ...
- JBoss AS 7之基本配置和部署(The Return Of The King)
1.4 JBoss As 7基本配置 1.4.1 IP訪问控制 因默认情况下,jboss仅可通过127.0.0.1和localhost来訪问.假设你想局域网中的其他IP来訪问,你能够在standalo ...
- STL之lambda表达式
一.简介 我们可以向一个算法传递任何类别的可调用对象.对于一个对象或一个表达式,如果可以对其使用调用运算符,则称它为可调用的.即,如果e是一个可调用的表达式,则我们可以编写代码e(args),其中ar ...