LinkMartin Smith 给出的答案可能是最好的答案,但这里有一个替代方案:
-- CREATE TABLE WITH SOME DATA IN
CREATE TABLE T (X INT);
INSERT T VALUES (1), (2), (3);
-- CREATE A CLONE OF THIS TABLE, ADDING AN IDENTITY COLUMN
-- USING ORDER BY TO AFFECT THE ORDER OF THE INSERT
SELECT ID = IDENTITY(INT, 1, 1),
T.*
INTO T_Clone
FROM T
ORDER BY X DESC;
-- DROP ORIGINAL TABLE
DROP TABLE T;
-- RENAME CLONE TABLE TO ORIGINAL TABLE NAME
EXECUTE SP_RENAME 'dbo.T_Clone', 'T', 'OBJECT';
-- SELECT FROM TABLE TO CHECK RESULTS
SELECT *
FROM T;
回滚:
ALTER TABLE T DROP COLUMN ID;
编辑
已经指出SELECT ID = IDENTITY(INT, 1, 1).. INTO.. FROM .. ORDER BY ...不保证插入的顺序。因此,故障安全选项似乎是使用CREATE TABLE 语法创建克隆表并添加IDENTITY 列:
CREATE TABLE T_Clone
( ID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
<your columns>
);
INSERT T_Clone (<your columns>)
SELECT <your columns>
FROM T
ORDER BY ...;
然后像上面那样继续 Drop 和重命名。我找不到任何文档说这种方法对于订购插件不可靠,如果证明仍然不可靠,您可以使用:
SET IDENTITY_INSERT T_Clone ON;
INSERT T_Clone (ID, <your columns>)
SELECT ROW_NUMBER() OVER(ORDER BY ...),
<your columns>
FROM T;
SET IDENTITY_INSERT T_Clone OFF;
然后在插入后重新播种 T_CLone。