2013-08-25 7 views
14

Я пытаюсь добавить новый столбец в существующую таблицу, где значение - номер строки/ранг. Мне нужен способ генерации номера строки/ранга, и мне также необходимо ограничить затронутые строки - в этом случае наличие подстроки внутри строки.Как добавить столбец номера строки в SQL Server 2012

Прямо сейчас у меня есть:

UPDATE table 
SET row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) FROM table 
WHERE CHARINDEX('2009',col2) > 0 

И я получаю эту ошибку:

Windowed functions can only appear in the SELECT or ORDER BY clauses. 

(та же ошибка для RANK())

Есть ли способ, чтобы создать/обновить столбец с функция ROW_NUMBER()? FYI, это означает заменить неправильный, уже существующий столбец «rank».

+0

Не могли бы вы указать, какие столбцы находятся в вашей таблице, по крайней мере те, которые вы планируете сортировать, искать и обновлять? – dcaswell

ответ

24

Вы можете сделать это с КТР, что-то вроде:

with cte as 
(
    select * 
    , new_row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) 
    from MyTable 
    where charindex('2009',col2) > 0 
) 
update cte 
set row_id = new_row_id 

SQL Fiddle with demo.

+0

Спасибо, он работал, как только я создал row_id в первую очередь. –

-1

Простой обходной путь будет создать временную таблицу, которая выглядит как

CREATE TABLE #temp (ID INT, ранг INT)

Где идентификатор того же типа, как первичный ключ в вас основной таблице.

Просто используйте SELECT INTO для первого заполнения временной таблицы, а затем обновить из временной таблицы ...

1

Если вы только обновите несколько тысяч строк, вы можете попробовать что-то вроде этого:

select 'UPDATE MyTable SET ID = ' + CAST(RowID as varchar) + ' WHERE ID = ' + CAST(ID as varchar) 
From (
select MyTable, ROW_NUMBER() OVER (ORDER BY SortColumn) RowID from RaceEntry 
where SomeClause and SomeOtherClause 
) tbl 

Копирования и вставьте результаты запроса в редактор запросов и запустите. Это немного вяло, а yukky немного работает.