Как обновить n строк в таблице?

Мне нужно обновить первые N строк в таблице, удовлетворяющих условию.

Я знаю, что могу сделать Update Top N... но проблема в том, что N находится в @variable.

ОБНОВЛЕНИЕ TOP @N SET... не работает.

Есть ли способ сделать это, что мне просто не хватает?

Здесь нет конкретных определений таблиц, потому что не имеет значения, какие столбцы. Если я могу сделать это для таблицы с одним столбцом, я могу сделать это для своей таблицы.


person Moose    schedule 28.09.2009    source источник


Ответы (2)


Вам нужно использовать круглые скобки после предложения TOP, когда вы хотите использовать переменную:

UPDATE TOP(@N) ...
person mmx    schedule 28.09.2009
comment
Крутой трюк! Спасибо, что научил меня этому. Интересно, что именно этот синтаксис не работает с конструкцией SELECT TOP n. Я могу понять, почему это произошло, хотя это несколько странная асимметрия в TSQL. - person mjv; 28.09.2009
comment
SELECT TOP n работает, только если n является константой, а не переменной. Так это работало до 2005 года. TOP с переменным аргументом и TOP для операторов DML были добавлены с 2005 года и требуют скобок. - person mmx; 28.09.2009
comment
Это было бы действительно здорово, однако обновление top(@N) set systemuserid = @ID, где systemuserid равно null, дает мне неправильный синтаксис рядом с ключевым словом «set». - person Moose; 28.09.2009
comment
Moose: вам нужно указать таблицу, которую вы хотите обновить, после предложения TOP(n). Конечно, если для вас важен порядок, вы все равно должны рассмотреть решение Quassnoi. - person mmx; 28.09.2009
comment
Неважно, я идиот сегодня утром. Помогает задать имя таблицы. - person Moose; 28.09.2009
comment
Спасибо Мехдад. Недостаточно кофе сегодня утром, нужно начать капельницу. - person Moose; 28.09.2009

WITH    q AS
        (
        SELECT  TOP (@r) *
        FROM    mytable
        ORDER BY
                col1
        )
UPDATE  q
SET     co12 = @value

UPDATE TOP (@r) будет работать, но будет обновлять любые @r строки в произвольном порядке.

Из документации:

Строки, на которые ссылается выражение TOP, используемое с INSERT, UPDATE или DELETE, не располагаются в каком-либо порядке. TOP n возвращает n случайных строк.

person Quassnoi    schedule 28.09.2009
comment
@KM: на этот раз я исправил утверждение до того, что ты указал :) - person Quassnoi; 28.09.2009
comment
+1, я хочу учиться, поэтому я пробую много кода, никогда не видел ОБНОВЛЕНИЕ CTE, мне придется немного поиграть с этим... - person KM.; 28.09.2009
comment
@KM: очень полезно удалять дубликаты. explainextended.com/2009/03/14/deleting-duplicates - person Quassnoi; 28.09.2009
comment
Я дам вам голос, потому что это тоже работает, но я не беспокоюсь о порядке. Просто нужно их разобрать. - person Moose; 28.09.2009