情况:我正在使用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数据库表中吗?如果你不能,为什么我的代码会执行并生成与我正在做的事情无关的文本?
谢谢大家!
答案 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 ...