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裏沒有數組這種數據類型,因此這裏利用字符串,把其看成數組來使用,可是須要兩個自定義函數: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

相關文章
相關標籤/搜索