定義函數獲取某結點下全部子結點:數組
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裏沒有數組這種數據類型,因此這裏利用字符串,把其看成數組來使用,可是須要兩個自定義函數:spa
——獲取數組長度:code
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
——獲取數組某位置的元素:blog
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 --這兒存在兩種狀況: -- 一、字符串不存在分隔符號 -- 二、字符串中存在分隔符號,跳出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字符串就能夠批量刪除了。返回值是受影響的條數it