web-dev-qa-db-ja.com

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()関数で列を作成/更新する方法はありますか?ちなみに、これは、正しくない既存の「ランク」列を置き換えることを目的としています。

18
Michael Carper

これは、次のようなCTEで実行できます。

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デモあり

26
Ian Preston

数千行しか更新しない場合は、次のようなことを試すことができます。

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

クエリ結果をコピーしてクエリエディターに貼り付け、実行します。それはそれが機能する少し緩慢でゆるいビットです。

1
Sparhawk_