繁体   English   中英

在SAS(WPS)中使用Proc SQL时出现“列名无效”错误

[英]'Invalid column name' error when using Proc SQL in SAS (WPS)

我正在测试一个非常小的宏,它使用Proc SQL命令从SQL数据库中提取。 我已经多次使用它并了解它是如何工作的但这一次它让我很难受!

%macro Correlation(dsn,db,prevdb,prodcode,sqltable,var,brick);

proc sql;
    connect to ODBC (required="DSN=&dsn;" );
    create table comp_correlation as select * from connection to ODBC
    (select a.Table_Name,
            a.Variable,
            a.Correlation as Current_Corr
        from DBTest.dbo.MetaData as a
        where Product_Code=&prodcode. and Table_Name=&sqltable. and 
     variable=&var.);
     disconnect from ODBC;
quit;

%mend;

然后我用以下参数调用此宏。 我的服务器名称已被删除,但我可以向您保证它已成功连接。

%Correlation(********, A2019, A2018, HouseValues, Houses, Value);

但是,它返回以下错误:

[Microsoft][SQL Server Native Client 11.0][SQL Server]Invalid column name 'HouseValues'.

任何人都知道为什么会这样吗? 我甚至没有尝试选择产品代码作为列,它只在我的where声明中?

看来你在下面的电话中错过了一个参数:

%相关(********,A2019,A2018,HouseValues,Houses,Value);

这是一个错字还是我解释错了?

谢谢

我现在使用%bquote宏修复了这个问题。

%macro Correlation(dsn,db,prevdb,prodcode,sqltable,var,brick);

proc sql;
    connect to ODBC (required="DSN=&dsn;" );
    create table comp_correlation as select * from connection to ODBC
    (select a.Table_Name,
        a.Variable,
        a.Correlation as Current_Corr
      from DBTest.dbo.MetaData as a
     where Product_Code=%bquote('&prodcode') and Table_Name=%bquote('&sqltable') and 
 variable=%bquote('&var'));
 disconnect from ODBC;
quit;

%mend;

听起来像你的实际错误是你没有引号将字符串值传递给远程数据库。 你可以通过在宏调用中传递引号来解决这个问题。

%macro Correlation(dsn,db,prevdb,prodcode,sqltable,var,brick);

proc sql;
    connect to ODBC (required="DSN=&dsn;" );
    create table comp_correlation as select * from connection to ODBC
    (select a.Table_Name,
            a.Variable,
            a.Correlation as Current_Corr
        from DBTest.dbo.MetaData as a
        where Product_Code=&prodcode. and Table_Name=&sqltable. and 
     variable=&var.);
     disconnect from ODBC;
quit;

%mend;

%Correlation(dsn=********,db=A2019,prevdb=A2018
   ,prodcode='HouseValues', sqltable='Houses', var='Value');

请注意,您可以在宏调用中使用参数名称,即使是已定义的参数也允许按位置调用它们。

你也可以让你的宏更智能,并让它添加引号。 您甚至可以使其足够智能,以删除值周围的任何可选的现有双引号,并用单引号替换它们。

%let prodcode=%sysfunc(quote(%qsysfunc(dequote(%superq(prodcode)))),%str(%'));

然后你可以随便打电话给你。

prodcode=HouseValues
prodcode="HouseValues"
prodcode='HouseValues'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM