SAS PROC IMPORT不按命令创建OUT数据集

时间:2017-06-27 14:03:48

标签: import sas netezza enterprise-guide

情况:我正在使用PROC IMPORT导入xlsx文件,并希望将数据OUT发送到新的netezza数据库表。

我的问题:SAS似乎运行正常,但是日志显示使用我未使用的libref创建了一个完全不同的表名(并且清除了此libref)。

LIBNAME abc sasionza server=server database=db port=123 user=user pass=pass;
PROC IMPORT
    OUT = abc.DesiredTableName
    DATAFILE= "my/excelfile/file.xlsx"
    DBMS=xlsx
    REPLACE;
    SHEET="Sheet1";
    GETNAMES=YES;
RUN;

这种“运行”很好,或者看起来如此。我检查日志,我看到了:

  

注意:导入数据集有11个观察值和7个变量   注意: xyz .ATableCreatedDaysAgoInAnotherProgram 数据集已成功创建。注意:使用的程序导入(总处理时间):          实时0.55秒          cpu时间0.02秒

我想,嗯,这很奇怪。 libref xyz 实际上已被清除,因此我无法使用它,而 ATableCreatedDaysAgoInAnotherProgram 是我正在进行的完全不同的SAS电子指南程序中使用的表名。 / p>

听起来像内存或缓存问题。因此,我关闭了SAS电子指南的所有实例并启动了一个新的实例。我创建了一个只有我想要的行的新程序(上面列出的代码)。

它运行,我得到以下日志:

  

注意:导入数据集有11个观察值和7个变量   注意: WORK ._ PRODSAVAIL 数据集已成功创建。
  注意:使用的程序导入(总处理时间):          实时0.55秒          cpu时间0.02秒

我会注意到这是我第一次尝试使用PROC IMPORT直接向netezza表发送内容。到目前为止,我总是将文件导入WORK并在将它们插入数据库中的表之前与它们一起使用。我认为这可能是我可能不知道的SAS限制,但是PROC IMPORT(https://v8doc.sas.com/sashtml/proc/z0308090.htm)的SAS文档说你可以在OUT语句中指定一个两级名称,所以我觉得这应该工作。如果不能工作,那么我觉得SAS应该出错,而不是随机创建一个我甚至没有在我的代码中执行的表名。

摘要(tl; dr):您可以使用libref直接将PROC IMPORT导入到netezza数据库表中吗?如果你不能,为什么我的代码会执行并生成与我正在做的事情无关的文本?

谢谢大家!

2 个答案:

答案 0 :(得分:1)

解决方案导入的xlsx文件中的列在其中一个列名称中有空格... 只需删除列名称中的空格并保存对xlsx文件的更改允许上面的PROC IMPORT代码完美执行,并将所需的结果导入到命名的netezza表中。

注意:这解决了我的问题,但它没有解释SAS日志显示执行的文本实际上并不在要执行的代码中。

答案 1 :(得分:0)

听起来你应该报告问题,而不是向SAS发送有效的ERROR消息。

要确保您的SAS / Netezza表没有包含空格的变量名,请在运行程序之前更改VALIDVARNAME选项的设置。这样,PROC IMPORT会将XLSX文件中的列标题转换为有效的变量名。

options validvarname=v7;
libname out ...... ;
proc import out=out.table replace ...