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文件都在,以后你需要用的时候,还可以用附加数据库的方法加上去,分离数 ...
随机推荐
- C#.NET常见问题(FAQ)-控制台程序如何输出Messagebox
1 添加如下引用 2 添加引用和Messagebox的代码. 3 测试可行 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/aceta ...
- 嵌入式web服务器-thttpd
交叉编译thttpd http://lakie.blog.163.com/blog/static/45185220201162910432330/ thttpd安装与调试 http://blog.cs ...
- Mysql分区的技能
1. 查看分区信息 (1)explain partitions select * from TDM_YTMF_BRAND_CATE_GDS_STC_D 语法:explain partitions se ...
- Struts2(二)action的三种方式
一.普通java类 package com.pb.web.action; /* * 创建普通的java类 */ public class HelloAction1 { public String ex ...
- JDBC一(web基础学习笔记七)
一.JDBC Java数据库的连接技术(Java DataBase Connectivity),能实现Java程序以各种数据库的访问 由一组使用Java语言编写的类和接口(JDBC API)组成,它j ...
- 玩转oracle学习第五天
1.上节回想 2.维护数据的完整性 3.管理索引 4.管理权限和角色 1.掌握维护oracle数据完整性的技巧 2.理解索引的概念,会建立索引 3.管理oracle的权限和角色 介绍:维 ...
- javaweb笔记全套
Lesson 1 一.eclipse工具的使用 1. java代码的位置 1) 选择工作空间 workspace 选择一个文件夹存放程序(代码) 不要用中文和空格 2) 新建一个java 工程(Pr ...
- Linux高级权限管理
传统的UGO(rwx-wx-wx)权限模型,无法解决当多个组需要对一个文件执行某些权限的问题. ACL :访问控制列表access control list一种高级的权限机制,允许我们对文件或者文件夹 ...
- CSDN开源夏令营 基于Compiz的switcher插件设计与实现之compiz特效插件介绍及特效实现
compiz自带的特效插件不够多,也不够强大.为了更好的体验compiz的特效,我们能够安装特效插件,在终端输入命令:sudo apt-get install compiz-plugins就能够下载特 ...
- 转载:在PHP语言中使用JSON和将json还原成数组
一.json_encode() 1 2 3 4 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); e ...