web-dev-qa-db-ja.com

SQL Serverで行の行IDを取得する方法

1つのテーブルCSBCA1_5_FPCIC_2012_EES207201222743があり、2つの列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の昇順で行を返しますが、テーブルに挿入された順に行が必要です。

8
Ravi

SQL Serverは挿入された行の順序を追跡しないため、現在のテーブル構造が与えられた場合にその情報を取得する確実な方法はありません。 _employee_id_がIDENTITY列である場合でも、挿入の順序をそれに頼ることは100%確実ではありません(ギャップを埋め、_SET IDENTITY_INSERT ON_を使用して重複したID値を作成することもできるため) 。 _employee_id_がIDENTITY列である場合and行が手動で間違って挿入されていないことが確実な場合、このクエリのバリエーションを使用して選択できるはずです。最新のデータから順番に:

_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()を実行するだけの既存のコードを破壊する可能性があることに注意してください。コードを再検討して、適切な明示的な列リストを定義する必要がある場合があります。

12
Aaron Bertrand

行の物理アドレスを示す%% physloc %%と呼ばれる疑似列があります。

SQL ServerのOracleのRowIDに相当 を参照してください

6
robie2011

SQLはそれを行いません。テーブル内のタプルの順序は、挿入日順ではありません。多くの人は、この問題を回避するために、挿入の日付を格納する列を含めます。

2