SAS:从关系数据库中选择行

时间:2016-01-20 14:20:20

标签: sas odbc

我在一个关系数据库上使用SAS,我可以使用libname odbc语句访问该数据库,如下所示:

libname myDBMS odbc datasrc="myDBMS"; 

假设数据库包含一个名为'myTable'的表,其中包含一个数值变量'var_ex',其值可以是0,1或。 (失踪)。现在说我要排除var_ex = 1的所有行。

如果我使用以下内容:

DATA test1;
SET myDBMS.myTable;  /* I call directly the table from the DBMS */
where var_ex NE 1;
run;

我没有得到'var_ex'缺失的行。以下是日志的屏幕截图,其中包含我的实际数据:

enter image description here

然而,如果我在工作中导入表格后做同样的事情:

DATA myTable;        /* I put myTable in the Work library */
SET myDBMS.myTable;
run;
DATA test2;
SET myTable;  /* I call the table from the work */
where var_ex NE 1;
run;

我按预期选择'var_ex'为0或缺少的行。这是日志的屏幕截图,包含我的实际数据: enter image description here

如果我使用PROC SQL代替DATA步骤,或者使用其他NE,则会发生同样的情况。 我做了一些研究,或多或少地理解here,如果你直接在DBMS表上工作,就会发生这样的意外事情。

这是否意味着根本不建议使用DBMS表,并且必须在执行任何操作之前在本地导入表,如下所示?

DATA myTable;        /* I put myTable in the Work library */
SET myDBMS.myTable;
run;

或者是否有适当的方法来操纵这些表?

1 个答案:

答案 0 :(得分:2)

测试SAS如何将数据步骤代码转换为数据库代码的最佳方法是DateUtils.formatDateRange。在运行代码之前,请尝试以下方法:

options sastrace=',,,db' sastraceloc=saslog;

然后运行代码测试。检查日志时,您将准确了解SAS如何翻译代码(如果可以的话)。如果它不能,你会看到,

  

ACCESS ENGINE:SQL语句未传递给DBMS,SAS将进行处理。

后跟select * from table

通常,如果SAS无法将数据步骤代码转换为特定于dbms的代码,则会将所有内容都拉到本地操作数据。通过查看此输出,您可以精确地确定如何将数据步骤转换为您需要的内容。

如果所有其他方法都失败了,您可以使用显式SQL传递。括号中的代码与您直接从其他客户端运行SQL的方式相同。

proc sql;
connect to odbc(datasrc='source' user='username' pass='password');
    create table want as
        select * from connection to odbc
            (<code specific to your dbms language>);
disconnect from odbc;
quit;