2010-03-22 2 views
1

Запрос говорит все это, я не могу найти правильный синтаксис, не без использования цикла WHILEСтол для переиндексации; обновить с от

UPDATE Webtree SET Webtree.Sorting=w2.Sorting 
FROM 
(
    SELECT 
    BranchID, 
    CASE 
    WHEN @Index>=ROW_NUMBER() OVER(ORDER BY Sorting ASC) THEN ROW_NUMBER() OVER(ORDER BY Sorting ASC) 
    ELSE ROW_NUMBER() OVER(ORDER BY Sorting ASC)+1 
    END AS Sorting 
    FROM Webtree w2 
    WHERE [email protected] 
) 
WHERE Webtree.BranchID=w2.BranchID 

ответ

0

Не уверен, какая версия SQL Server вы находитесь на - если вы на SQL Server 2005 или выше, вы можете попробовать и использовать CTE (Common Таблица Expression):

; WITH BaseData AS 
(
    SELECT 
     BranchID, 
     CASE 
     WHEN @Index >= ROW_NUMBER() OVER(ORDER BY Sorting ASC) THEN ROW_NUMBER() OVER(ORDER BY Sorting ASC) 
     ELSE ROW_NUMBER() OVER(ORDER BY Sorting ASC)+1 
     END AS Sorting 
    FROM Webtree 
    WHERE ParentID = @ParentID 
) 
UPDATE Webtree 
SET Webtree.Sorting = base.Sorting 
FROM BaseData base 
WHERE Webtree.BranchID = base.BranchID 

Не знаете, где эти @Index и @ParentID значения происходят из - они должны быть доступны для КТР, конечно!

CTE создает нечто вроде «встроенного временного представления», доступного только следующему утверждению после него. Таким образом, вы часто можете «распутать» два смешанных заявления и сделать свои намерения и ваши шаги более ясными (кому-то еще читающему код или самому себе, если вам нужно вернуться и изменить это через 6 месяцев) ...

+0

это сервер Sql 2008 Я пробовал ваш запрос, и я получаю «Неправильный синтаксис рядом с ключевым словом« с ». Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста изменения отслеживания, предыдущий оператор должен быть прерван точка с запятой ". –

+0

Это должно быть первое утверждение в партии - если перед вами есть материал, добавьте его точкой с запятой (;). –

+0

oh и индекс - это только индекс на основе нуля на ветке, которую я хочу переместить внутри ParentID дерева. –

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