2011-01-11 21 views
3

テーブルにUniqueidentifier or identity列がない場合、最後に挿入された行を取得するにはどうすればよいですか。SQLサーバーで最後に挿入された行を取得する方法

私はあなたの良いアイデアを待っています。

+1

これは私の意見ですが、アプリケーション自体が利用していなくても、すべてのテーブルに一意のIDが必要です。このようにすると、問題が解決されます – saret

+1

テーブルにインデックスがない場合を除き、できません。なぜあなたは最後のレコードをしたいのですか? –

+1

ユニーク識別子が使用されているときに@saret最後のレコードを取得することはまだできません –

答えて

4

これを判断するために行の順序を特定できる方法が必要です。 「作成日」やIDENTITY列のようなもの。

2

できません。表は、順序付けられていない行*で構成されます。たとえば、行が挿入されたときなどに、その情報をテーブル定義に追加し(新しい列を追加して)、その情報を適切に入力する必要があります。

*クラスタ化されたインデックスであっても、のほうが健全です。常には、テーブルを順序付けられていない行として扱います。クラスタ化されたインデックスは便利ですが、特定の物理的な順序を保証するものではありません(この回答に対するMartinのコメントのように)

+0

1ページ内の行は、クラスタ化インデックスによって必ずしも順序付けされるわけではありませんが、行オフセットのリストはあります。つまり、フルページにキー値 '1,2,3,5,6 'を持つ行があり、' 1'が削除され、 '4'が挿入された場合、ページ全体が再編成されません。それは'行オフセットのリストを更新していた。 –

+0

@Martin - もちろん、あなたは正しい。私は誤解していた。 –

0

できません。データを抽出するには、何らかの識別子が必要です。 ID、DateTime ..常に他のものと異なるもの。

2

uniqueIdentifierまたはIDなしでテーブルから最後の行を取得する場合は、挿入トリガーを使用できます。

+0

+1良いアイデアは、これは私の心に最初に考えられていた。 –

-1
DECLARE @IDs TABLE(id int) 

insert into TableName(TableID, TableRowValue) 
output inserted.TableID into @IDs 
values(857, 'Test'); 

- あなたがSELECT SCOPE_IDENTITYを(使用する必要がありますストアドプロシージャによって何かを挿入すると、挿入アイデンティティは

+0

これが質問の文脈であれば、出力テーブルは必要ありません。 – RichardTheKiwi

0

変数@IDsテーブルになります)、現在のセッションで作成された最後のID値を返します、それはあなたの現在の範囲にも制限されます。 このように使用すると、最後に挿入されたIDがトリガによって引き起こされることはありません。

同じまたは呼び出されたプロシージャ内に挿入操作のためにresultを使用するかどうかを念頭に置いてください。

関連する問題