0

MS Access データベースがあります。このデータベースのテーブルを SAS で処理および更新する必要があります。テーブルは非常に大きくなる場合があります。一部の処理では、純粋な SAS 関数を使用する必要があります。SAS/ACCESS LIBREF to MS Access では、PROC SQL を使用してテーブルを更新または変更することはできません。したがって、次の 2 つのアプローチが考えられます。

  1. LIBREF の使用: テーブル全体を SAS にコピーします。Access で元のテーブルを削除します。SAS でテーブルを処理します。テーブルを Access に書き戻します。
  2. PROC SQL パススルーの使用: 必要な行を SAS に読み込みます。SAS を使用してこれらの行を処理します。Access で行を更新します。

私の質問: 2 番は可能ですか? SQL 関数 (SAS ではなく) を使用すると、番号 2 で概説されているプロセスは番号 1 よりも桁違いに高速です。この違いは、DBMS によって完全に処理されるデータに起因することを理解していますが、番号 2 は依然として高速である必要があります。 、 右?

4

3 に答える 3

1

私が提案するのはオプション 2 です。次に、LIBREF を使用してこれらの行を一時テーブルにアップロードし、パススルーを使用してより大きなテーブルを更新します。librefを介して行を直接更新することは可能かもしれませんが、その部分に答えるためにAccessへのSAS接続に十分に精通していません。

于 2012-09-20T13:56:11.210 に答える
0

PROC SQL UPDATE将来の読者のために: SAS はMS Access ライブラリのステートメントをサポートしていないため、この質問をしました。Access テーブルを更新するには、データベースに新しいテーブルを作成し、パススルー ステートメントを使用する必要があります。私の最初の本能はUPDATE、句を代入するステートメントを使用してWHERE、レコードのサブセットを更新することでした。これを調査しているときに、Jet SQL はレコードのサブセットの更新をサポートしていないという悪い情報を読みました。これは正しくありません。を使用するINNER JOINと、サブセットを更新できます。以下のコード例:

/* Access database is "C:/database.mdb".
   Original table in database is "original". 
   Processed table is "work.updates". */

libname mdbfile "C:/database.mdb";

proc sql;
create table mdbfile.updates as select * from work.updates;
connect to access (path="C:/database.mdb");
execute (
  update original as a inner join updates as b on a.id = b.id
  set a.variable1 = b.variable1
  where condition = 1
) by access;
execute (drop table updates) by access;
disconnect from access;
quit;
于 2012-09-24T20:09:04.140 に答える
0

LIBNAME ステートメントを使用して Access データベースに接続する場合、そのデータベースの更新を有効にするためにオプション 'scan_text=no' を追加する必要があります。その後、MODIFY を使用して既存のレコードを変更したり、APPEND を使用して新しいレコードを追加したりできます。以下は、私が少し前に書いたトレーニング コードです。これは Excel に接続しますが、原理は Access でも同じです。

/* Create libname to Excel */
libname xl 'N:\SAS\Code\sas_training\sample_data\range.xls' scan_text=no; /* important to use this option */

/* Create table with updated values */
data xl_update;
input month a b c d;
cards;
200909 1 2 3 4
200910 5 6 7 8
200911 10 11 12 13
run;

/* Extract latest month from existing data */
proc sql noprint;
select max(month) into :maxmth
from xl.testdata;
quit;

/* Update existing values */
data xl.testdata;
modify xl.testdata xl_update (where=(month<=&maxmth.));
by month;
run;

/* Append new rows to exisiting data */
proc append base=xl.testdata 
            data=work.xl_update (where=(month>&maxmth.));
run;

libname xl clear;
于 2012-09-21T07:43:02.507 に答える