如何在SQL Server中获取行的行ID

10

我有一个名为CSBCA1_5_FPCIC_2012_EES207201222743的表,有两列employee_idemployee_name

我使用了以下查询

SELECT ROW_NUMBER() OVER (ORDER BY EMPLOYEE_ID) AS ID, EMPLOYEE_ID,EMPLOYEE_NAME 
FROM CSBCA1_5_FPCIC_2012_EES207201222743 

但是,它会按照employee_id升序返回行,但我需要按照它们插入到表中的顺序返回行。


4
除非employee_id是一个自增列,否则SQL Server不知道它们被插入表的顺序(如果是自增列,则可以使用EMPLOYEE_ID DESC来改变顺序,但这并不是完全可靠的)。 - Aaron Bertrand
不,SQL Server不会跟踪那个。您需要自己添加这样的列。 - Aaron Bertrand
3个回答

15

SQL Server无法跟踪插入行的顺序,因此在您当前的表结构下,没有可靠的方法获取该信息。即使employee_id是一个IDENTITY列,也不能完全依赖它来确定插入顺序(因为您可以使用SET IDENTITY_INSERT ON填充间隙并甚至创建重复的ID值)。如果employee_id是一个IDENTITY而且您确定未手动按顺序插入行,则应该能够使用查询的这个变体以按顺序选择数据,最新的数据放在第一位:

SELECT 
   ROW_NUMBER() OVER (ORDER BY EMPLOYEE_ID DESC) AS ID, 
   EMPLOYEE_ID,
   EMPLOYEE_NAME 
FROM dbo.CSBCA1_5_FPCIC_2012_EES207201222743
ORDER BY ID;

您可以更改表格以跟踪新行中的信息,但是您将无法为现有数据推导出它(它们都将在您进行此更改时标记为已插入)。

ALTER TABLE dbo.CSBCA1_5_FPCIC_2012_EES207201222743 
-- wow, who named this?
  ADD CreatedDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

请注意,这可能会破坏现有的代码,只需执行INSERT INTO dbo.whatever SELECT/VALUES() - 例如,您可能需要重新审查代码并定义一个正确、明确的列列表。


7

%%physloc%% 不记录行插入的顺序,尽管随着时间的推移,它通常会随着行插入顺序的增加而增加。 - Charles Burns

2

SQL不能做到这一点。表中的元组顺序并不按照插入日期排序。许多人会在表中包含一个存储插入日期的列以解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接