Операция удаления SQL cte

У меня есть цит, который перебирает записи, создает список, и я @ParamterID параметр @ParamterID в выражении select, но в заданных операциях указан неправильный синтаксис рядом с Set и в этом выборе он получает путь, где я могу выполнить поиск путей которые LIKE '%' + @Path + '%', и те элементы, которые я хочу удалить из таблицы, называемой Post. может кто-то помочь мне заполнить это пожалуйста и исправить мой синтаксис SET @Path

DELCARE @ParmeterID int = 3
DECLARE @Path nvarchar(MAX) 

WITH cte(Url, Level, Path, PostID, ParentPostID)
AS (

SELECT REPLACE(LOWER(Title), ' ', '-'), 1 AS Level, CAST(PostID as nvarchar(MAX)) as Path,
PostID, ParentPostID
FROM Post
WHERE ParentPostID IS NULL

UNION ALL

SELECT cte.Url, cte.Level + 1,
LOWER(cte.Path + '-' + CAST(P.PostID AS VARCHAR(MAX))),
P.PostID, P.ParentPostID 
FROM Post P 
INNER JOIN cte ON P.ParentPostID = cte.PostID
)
-- says incorrect sybnatx near Set @Path
SET @Path = (SELECT Path FROM cte WHERE PostID = @ParemeterID); 


-- list i want to delete --
SELECT * FROM cte WHERE Path LIKE '%' + @Path + '%'

delete -- list -- FROM Post --
1 ответ

Я не уверен, что именно вы пытаетесь сделать (я не знаю вашу схему таблиц), но вы можете попробовать следующее:

DECLARE @ParmeterID int = 3

WITH cte(Url, Level, Path, PostID, ParentPostID)
AS (
 SELECT REPLACE(LOWER(Title), ' ', '-'), 1 AS Level, CAST(PostID as nvarchar(MAX)) as Path,
 PostID, ParentPostID
 FROM Post
 WHERE ParentPostID IS NULL

 UNION ALL

 SELECT cte.Url, cte.Level + 1,
 LOWER(cte.Path + '-' + CAST(P.PostID AS VARCHAR(MAX))),
 P.PostID, P.ParentPostID 
 FROM Post P 
 INNER JOIN cte ON P.ParentPostID = cte.PostID
)

delete p
from post p
join cte on p.postId = cte.postId and 
 cte.path like '%' + (select top 1 [path] from cte where postId = @ParmeterID) + '%'

Addedd: упорядочивая path, пожалуйста, помните, что это быстрый и грязный способ.

WITH cte(Url, Level, Path, PostID, ParentPostID, Sequence)
AS (
 SELECT REPLACE(LOWER(Title), ' ', '-'), 1 AS Level, CAST(PostID as nvarchar(MAX)) as Path,
 PostID, ParentPostID, right(replicate('0', 8) + cast(PostID as varchar(max)), 8)
 FROM Post
 WHERE ParentPostID IS NULL

 UNION ALL

 SELECT cte.Url, cte.Level + 1,
 LOWER(cte.Path + '-' + CAST(P.PostID AS VARCHAR(MAX))),
 P.PostID, P.ParentPostID, cte.sequence + right(replicate('0', 8) + cast(p.PostID as varchar(max)), 8)
 FROM Post P 
 INNER JOIN cte ON P.ParentPostID = cte.PostID
)
select Url, Level, Path, PostID, ParentPostID
from cte
order by Sequence

licensed under cc by-sa 3.0 with attribution.