2015-05-16 3 views
2

Просто странная проблема с оператором SQL. Я использую оператор WITH для сбора родительских и дочерних строк для древовидной структуры.SQL WITH CTE, за которым следует проблема с удалением

Затем я хочу удалить родителя и только их детей.

Мой код выглядит следующим образом (в хранимой процедуре):

DECLARE @AssignmentIds TABLE 
(
    AssignmentIds int 
); 

with DeleteTree(AssignmentID) 
as 
(
    select AssignmentID 
    from Assignment 
    where AssignmentID = @AssignmentID 

    union all 

    select a.AssignmentID 
    from Assignment a 
    join DeleteTree d on a.ParentID = d.AssignmentID 
) 
/* insert results of above with into table var*/ 
insert into @AssignmentIds 
    select AssignmentID from DeleteTree 

/*This select returns the CORRECT Ids!*/ 
/*SELECT * from @AssignmentIds*/ 

/*Delete Roster Info*/ 
delete from [dbo].[Roster] 
where [AssignmentId] in (select AssignmentId from @AssignmentIds) 

/*Delete Assignments*/ 
delete from [dbo].[Assignment] 
where [AssignmentID] in (select AssignmentID from @AssignmentIds) 

Странная часть, что, если я бегу избранная на результатах работы с, я правильно список правильных идентификаторов назначения ,

Но когда я запускаю оператор delete, он удаляет все строки в таблице назначений, а не только идентификаторы, найденные оператором with!

+0

Привет, Георгий, да, я проверил и нет каскадного удаления в таблице таблиц списков или заданий - спасибо за комментарий. – user1191559

ответ

0

Я надеюсь, что это поможет кому-то. Но из-за опечатки в операторах delete в конце (Имя столбца таблицы @AssignmentIds var было ошибочно «AssignmentIds», а не «AssignmentId»), SQL Parser не выдавал ошибку и вместо этого удалял все строки в списке и таблицы назначения.

Я все еще не знаю, почему это было бы, а не удалять что-либо, но, возможно, у кого-то есть такой ответ.

Итак, урок, который я изучил, - это поиск опечаток в операциях удаления. Иначе его страшно!

Смежные вопросы