我在一个关系数据库上使用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'缺失的行。以下是日志的屏幕截图,其中包含我的实际数据:
然而,如果我在工作中导入表格后做同样的事情:
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或缺少的行。这是日志的屏幕截图,包含我的实际数据:
如果我使用PROC SQL
代替DATA步骤,或者使用其他NE
,则会发生同样的情况。
我做了一些研究,或多或少地理解here,如果你直接在DBMS表上工作,就会发生这样的意外事情。
DATA myTable; /* I put myTable in the Work library */
SET myDBMS.myTable;
run;
或者是否有适当的方法来操纵这些表?
答案 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;