この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 11405|答える: 0

[ヒント] SQLはINSERTを待つと主キーの値を取得します

[リンクをコピー]
掲載地 2015/05/05 17:35:51 | | |

SQL SERVER 2000における識別値フェッチ関数     
  SQL Server 2000では、識別列はIDENTITYによって定義され、以下は最後に挿入されたレコードの識別値を取得することに関連しています   
   
  オフの関数の例     
   
          SQL Serverでは、SCOPE_IDENTITY()、@@IDENTITY、IDENT_CURRENT()を使って最後に挿入されたレコードの値を取得できます。これらの差は次の通りです:   
  SCOPE_IDENTITY()は同じスコープ内のIDENTITY列に挿入された最後のIDENTITY値を返します。 スコープはモジュールであり、ストアドプロシージャ、トリガー、関数のことです   
   
  番号かバッチか。 したがって、2つの文が同じストアドプロシージャ、関数、またはバッチ内にある場合、同じスコープに属します。   
  @@IDENTITY 現在のセッション内のすべてのテーブルで生成された最後の識別値を返します   
  IDENT_CURRENT()は、任意のセッションおよびスコープにおいて指定されたテーブルに対して生成された最後の識別値を返します   
  彼らの違いを示す例を挙げます     
   
  -- a) サンプルコード     
  --   ===========================================   
  -- テストテーブルを作成する   
  --   ===========================================   
  USE tempdb   
  行け   
   
  CREATE table t1(id int IDENTITY,col int)   
  挿入 t1 選択 1   
  ユニオン オールセレクト 2   
  CREATE table t2(id int IDENTITY,col int)   
  行け   
   
  T2でトリガー TR_insert_t2を作成   
  挿入用   
  AS   
          挿入 t1 セレクト 3   
  行け     
   
  --   ===========================================   
  -- 3つの関数のテスト: 1   
  --   ===========================================   
  T2値(1)   
  SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),   
          [@@IDENTITY]=@@IDENTITY、   
          [IDENT_CURRENT() for t1]=IDENT_CURRENT(N't1'),   
          [IDENT_CURRENT() for t2] =IDENT_CURRENT(N't2')   
   
  /*--結果   
  SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() t1 に対して IDENT_CURRENT() t2 に対して                                         
  ------------------   ------------   --------------------------   -----------------------   
  1                                     3                         3                                                     1   
   
  (影響を受ける行数は1行です)   
  --*/   
  行け   
   
  --   ===========================================   
  -- 3つの関数のテスト: 2   
  --   ===========================================   
  T1値(10)を挿入してください   
  SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),   
          [@@IDENTITY]=@@IDENTITY、   
          [IDENT_CURRENT() for t1]=IDENT_CURRENT(N't1'),   
          [IDENT_CURRENT() for t2] =IDENT_CURRENT(N't2')   
   
  /*--結果   
  SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() t1 に対して IDENT_CURRENT() t2 に対して                                         
  ------------------   ------------   --------------------------   -----------------------   
  4                                     4                         4                                                     1   
   
  (影響を受ける行数は1行です)   
  --*/   
  行け   
   
  --   ===========================================   
  -- 3つの関数のテスト: 3   
  -- ** 新しい接続を開き、以下のコードを実行してください **   
  --   ===========================================   
  SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),   
          [@@IDENTITY]=@@IDENTITY、   
          [IDENT_CURRENT() for t1]=IDENT_CURRENT(N't1'),   
          [IDENT_CURRENT() for t2] =IDENT_CURRENT(N't2')   
   
  /*--結果   
  SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() t1 に対して IDENT_CURRENT() t2 に対して                                         
  ------------------   ------------   --------------------------   -----------------------   
  ヌル ヌル 4 & n     
   
  --===========================================   
  -- テスト環境を削除してください   
  --   ===========================================   
  テーブルT1、T2をドロップする     
   
  -- b) コード結果の記述     
  上記のコードからもわかるように:   
  IDENT_CURRENT()は常に指定されたテーブルに挿入された最後に識別された値を返します   
  @@IDENTITY 同じスコープかどうかにかかわらず、現在のセッションの同一値を返します。テスト1および2では、トリガーに挿入されたレコードの識別値を返すことがわかり、   
   
  テスト3では、現在のセッションに挿入レコードがないためNULLが返されます   
  SCOPE_IDENTITY()は現在のセッションと同じスコープの識別値を返すため、テスト1、2ではトリガーの影響を受けない値を返し、テスト3では現在のセッションが補間されていないため   
   
  レコードを返すため、NULLを返します





先の:なぜみんなメーデーの祝日に行ったの?
次に:t-sqlでSCOPE_IDENTITY()が書かれる前に書かれた後と書かれる違いは何ですか?
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com