Sas 变量已定义为字符和数字

Sas 变量已定义为字符和数字,sas,Sas,正在努力解决上述错误: 变量已定义为字符和数字 我有一个摘录,它在SAS中打印一个表格,另一个摘录提取,每天有数百个微表格,其中有一个或两个在一列中有数值 我当前的步骤如下所示: DATA ALL; SET Library.XYZ:; RUN; 冒号查找标记为XYZdate9的任何内容 但是当我运行代码时,我在列A上得到了错误。 有没有办法在合并表时强制将列转换为字符或完全删除它?手动解决方案 假设您对XUZBB的problemColumn有问题,您可以编写 DATA ALL; SET

正在努力解决上述错误:

变量已定义为字符和数字

我有一个摘录,它在SAS中打印一个表格,另一个摘录提取,每天有数百个微表格,其中有一个或两个在一列中有数值

我当前的步骤如下所示:

DATA ALL;
   SET Library.XYZ:;
RUN;
冒号查找标记为XYZdate9的任何内容

但是当我运行代码时,我在列A上得到了错误。 有没有办法在合并表时强制将列转换为字符或完全删除它?

手动解决方案 假设您对XUZBB的problemColumn有问题,您可以编写

DATA ALL;
SET Library.XYZaaa 
    Library.XYZbbb (rename (problemColumn = problemChar))
    Library.XYZccc ;
现在对于XYZBB中的观测行,problemColumn将不会有值missing value is。但是problemChar将具有所需值的字符表示

if problemColumn eq . then problemColumn = input(problemChar, best12.);
RUN;
您可能需要替换输入格式best12。用符合你数据的东西

自动溶解 编写一个proc SQL,列出您的数据集,并为需要的数据集重命名:

PROC SQL;
    select 'Library.'|| memName ||
           case when type = 'char' then ' (rename (problemColumn = problemChar))' 
                else '' end
    into :setsToRead separated by ' '
    from sasHelp.vcolumns
    where libName eq 'LIBRARY' and memName like 'XYZ%' and name = 'problemColumn';
quit;
现在使用创建的宏变量

Data ALL;
    Set &setsToRead.;

以此类推

理想情况下,您应该修复源代码,以便所有列都是主模式定义的相同类型。使用删除字段的选项,这似乎很危险,您可以将PROC APPEND与FORCE选项一起使用

下面是一些查找问题列的代码,以便您可以手动修复它们

*Code to isolate the variable/tables that may be the issue;
proc sql;
create table variable_types as
select libname, memname, upper(name) as name, type
from sashelp.vcolumn
where libname='WORK' and upper(memname) like 'CLASS%'
order by name, type;

create table variable_mismatch as
select * 
from variable_types
where name in (select name from variable_types group by name having min(type) ne max(type));
quit;
如果您只想删除需要放入宏循环的变量,这里有一些代码

*Create sample datasets;
data class;
set sashelp.class;
run;

data class2;
set sashelp.class(rename=age=age_num);

age=put(age_num, 2.);
run;

*Append via data step - generates error;
data want;
set class class2;
run;

*Append via proc append;
proc append base=class data=class2 force;
run;

我想你不知道哪几张桌子不同吧?然后你可以在一个数据步骤中用一个简单的put语句一个接一个地修改它们。我不知道,有几百个表,我猜我可以做一个过程比较,但不确定我如何在那么多表之间转换。你是如何创建这些数据集的?您是否使用PROC导入?如果使用PROC IMPORT,您可能会遇到这种类型的问题,因为它试图根据看到的值猜测您拥有哪些类型的变量。所以不同的数据子集可以产生不同的选择。如果您可以使用实际的数据步骤来替换PROC导入,从而一致地创建数据集,那么在合并步骤中就不会出现此问题。感谢您的回复。问题是我无法确定哪个表包含问题列,因为有超过100个表名XYZdate。这意味着要花上几天的时间去寻找导致变量错误的一两个原因,这就是自动化解决方案的目的。我只是希望您不要跳转到宏变量的最大长度。如果是这样的话,我确实有一个选择。顺便说一句,我没有测试这个。我会尝试一下。你能详细说明我为“problemchar”输入的内容吗?感谢您花时间帮助memName,例如“XYZ%”是一个sql条件,声明memName应该是XYZ,后跟其他任何内容。problemChar只是由rename语句创建的临时变量。