我正在测试一个非常小的宏,该宏使用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语句中?
答案 0 :(得分:3)
似乎您在以下调用中错过了一个参数:
%Correlation(********,A2019,A2018,HouseValues,Houses,Value);
是错别字还是我解释错了?
谢谢
答案 1 :(得分:1)
我现在使用%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;
答案 2 :(得分:1)
听起来像您的实际错误是您将字符串值传递给了远程数据库而没有引号。您可以通过在宏调用中传递引号来解决该问题。
%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'