如何在SQL Server 2012中添加行号列

如何在SQL Server 2012中添加行号列,sql,sql-server,ranking,row-number,ranking-functions,Sql,Sql Server,Ranking,Row Number,Ranking Functions,我正在尝试向现有表中添加一个新列,其中的值是行号/秩。我需要一种生成行号/秩值的方法,并且我还需要限制在这种情况下受影响的行,即字符串中存在子字符串 现在我有: 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

我正在尝试向现有表中添加一个新列,其中的值是行号/秩。我需要一种生成行号/秩值的方法,并且我还需要限制在这种情况下受影响的行,即字符串中存在子字符串

现在我有:

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.
排名也有同样的错误


有没有办法用ROW_NUMBER函数创建/更新列?仅供参考,这是为了替换不正确的、已经存在的排名列。

您可以使用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

.

简单的解决方法是创建一个如下所示的临时表

创建表临时id int,秩int

其中id与主表中的主键类型相同


只需使用SELECT INTO先填充临时表,然后从临时表更新…

如果您只更新几千行,您可以尝试以下操作:

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

将查询结果复制并粘贴到查询编辑器中,然后运行。它有点慢,而且有点有效。

您可以包括表中的哪些列,至少是您计划排序、搜索和更新的列吗?