0

我有一个 MS Access 数据库。我需要使用 SAS 处理和更新此数据库中的表。桌子可以很大。某些处理需要使用纯 SAS 函数。对于 MS Access 的 SAS/ACCESS LIBREF,您无法使用 PROC SQL 更新或更改表。因此,我看到了两种方法:

  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 将这些行上传到临时表,然后使用 passthrough 更新更大的表。可以通过 libref 直接更新行,但我对 SAS 与 Access 的连接不够熟悉,无法回答该部分。

于 2012-09-20T13:56:11.210 回答
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 回答
0

对于未来的读者:我问这个问题是因为 SAS 不支持PROC SQL UPDATE关于 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 回答