いいえ、SQL Server には、テーブルの「最後の行」を返す事前定義された関数はありません。
定義上、テーブルは順序付けされていない一連の行です。ビー玉の束を袋に入れたと想像してください。袋を開けて、他の人にどちらのビー玉が最初に入ったか最後に入ったか聞いてみましょう。次に、それらをすべて床に投げ、他の誰かが部屋に入ってきたら、最初に床にぶつかったか最後に床にぶつかったかを尋ねます。それらが落ちた順序について何かを示す追加情報がないため、それを行うことはできません。
同じことが SQL Server のテーブルにも当てはまります。 IDENTITY 列、datetime 列、またはトリガーを追加するか、変更追跡、CDC、監査などの外部機能を使用しない限り、SQL Server が最後に挿入された行を通知する方法はありません。 思うかもしれません order by 句なしでテーブルから選択するだけで 見える 正しい順序でデータが返されているように、これはまったくの偶然です。以下に例を示します:
CREATE TABLE dbo.floobat ( ID INT PRIMARY KEY, n VARCHAR(16), x CHAR(4000) NOT NULL DEFAULT '' ); INSERT dbo.floobat(ID,n) VALUES(1,'Sparky'); INSERT dbo.floobat(ID,n) VALUES(2,'Aaron'); INSERT dbo.floobat(ID,n) VALUES(3,'Norbert'); -- <-- inserted last SELECT ID, n FROM dbo.floobat;
プレ>わかりましたので、デフォルトでは、これで問題ないようです。結果:
ID n -- ------- 1 Sparky 2 Aaron 3 Norbert -- < yes, this is right
プレ>ただし、アプリケーションや上記の順序に依存するその他の要素が認識できないテーブルに変更を加えてみましょう。
CREATE NONCLUSTERED INDEX x ON dbo.floobat(n); SELECT ID, n FROM dbo.floobat;
プレ>ええとああ!結果:
ID n -- ------- 2 Aaron 3 Norbert 1 Sparky -- < oops, this is no longer right
プレ>これを覚えておく必要があります:ORDER BY 句を含めない場合、伝えている 順序を気にしない SQL Server。そのため、データを返す最も効率的な方法を見つけようとしていますが、それによって観察される順序が異なる可能性があります。上記のインデックスを追加すると、SQL Server がデータを取得するためのアクセス パスが改善されます。まだスキャンを使用していましたが、そのインデックスはクラスター化されたインデックス (ページに 2 行しか収まりませんでした) よりもはるかに細身でした。
Cust_ID
列が昇順で挿入されていません。5
を挿入すると そして2
より 、ORDER BYなしで選択すると、実際には2
になります 次に5
(より良いインデックスが存在しないと仮定します)。インデックスの作成 (または削除、変更、または再構築) 以外のことによって、順序付け動作に同じような変化が生じる可能性があります。サービス パック、CU、または修正プログラムを適用します。プロシージャ キャッシュをフラッシュします。さまざまな RECOMPILE オプションを使用します。統計の更新;サーバーを再起動します。トレース フラグの追加または無効化。サーバー オプション オプションの変更。データベースを別のサーバーに移動します。などなど
したがって、この情報を追跡したい場合は、他の回答のいくつかが対処しているように、何らかの方法で自分で追加する必要があります.