'Invalid column name' 在 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);

然而,它returns出现以下错误:

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

有人知道为什么会这样吗?我什至没有尝试 select 产品代码作为一列,它只在我的 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'