2014/07/01

Access 2013 ODBC リンク テーブル と SQL Server - 6

レコードを追加するとき、ODBC データソースであるSQL Serverとの間でどのような処理がされるのか。
INSERT INTO Table_1 ( F_Text )
VALUES ('ABC');
SQLExecDirect: INSERT INTO  "dbo"."Table_1"  ("F_Text") VALUES (?)
SQLExecDirect: SELECT @@IDENTITY
ログ上ではこの内容のみとなるけど、実際には、
  1. トランザクション:begin
  2. exec sp_executesql N'INSERT INTO "dbo"."Table_1" ("F_Text") VALUES (@P1)',N'@P1 nvarchar(10)',N'XXX'
  3. SELECT @@IDENTITY
  4. トランザクション:commit or rollback
この動作は、追加 クエリだけに限らず、テーブルを開いてレコードを追加するときなどでも同じになる。
複数のレコードが追加される追加 クエリの場合は、
INSERT INTO Table_1 ( F_Text )
SELECT T_Local1.F_Text
FROM T_Local1;
  1. トランザクション:begin
  2. exec sp_executesql N'INSERT INTO "dbo"."Table_1" ("F_Text") VALUES (@P1)',N'@P1 nvarchar(10)',N'XXX'
  3. SELECT @@IDENTITY
  4. exec sp_executesql N'INSERT INTO "dbo"."Table_1" ("F_Text") VALUES (@P1)',N'@P1 nvarchar(10)',N'YYY'
  5. SELECT @@IDENTITY
    ※以降追加レコード分繰り返し
  6. トランザクション:commit or rollback
本来なら パススルークエリ や SQL Server上での実行が望ましいけど、もう一つの ODBC リンク テーブルからレコードを追加したとき
INSERT INTO Table_1 ( F_Num )
SELECT Table_2.F_Num
FROM Table_2;
SQLExecDirect: SELECT "dbo"."Table_2"."ID" FROM "dbo"."Table_2" 
SQLPrepare: SELECT "ID","F_Num"  FROM "dbo"."Table_2"  WHERE "ID" = ?
SQLExecute: (GOTO BOOKMARK)
SQLExecDirect: INSERT INTO  "dbo"."Table_1"  ("F_Num") VALUES (?)
SQLExecDirect: SELECT @@IDENTITY
SQLExecute: (GOTO BOOKMARK)
SQLExecDirect: INSERT INTO  "dbo"."Table_1"  ("F_Num") VALUES (?)
SQLExecDirect: SELECT @@IDENTITY
SQLExecute: (GOTO BOOKMARK)
SQLExecDirect: INSERT INTO  "dbo"."Table_1"  ("F_Num") VALUES (?)
SQLExecDirect: SELECT @@IDENTITY
  1. 1行目:挿入元のテーブルから主キーのみ取得
  2. トランザクション:begin
  3. 2行目:挿入元のテーブルから1レコード取得
  4. 4行名:テーブルにレコード挿入
  5. 5行目:主キーの取得
    以降2~5行目繰り返し
  6. トランザクション:commit or rollback
挿入元のレコードを都度1レコードずつ取得する。処理効率が良くないことはおいといたとして、この挙動で問題がなけれな使えばいい。

0 件のコメント: