Ошибка «неверное имя столбца» при использовании Proc SQL в SAS (WPS) - PullRequest
0 голосов
/ 08 февраля 2019

Я тестирую очень маленький макрос, который использует команду 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?

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Я сейчас исправил это с помощью макроса %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;
0 голосов
/ 08 февраля 2019

Похоже, что ваша настоящая ошибка заключалась в том, что вы передали строковое значение в удаленную базу данных без кавычек.Вы можете решить это, передав кавычки в вызове макроса.

%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'
0 голосов
/ 08 февраля 2019

кажется, что вы пропустили один параметр в приведенном ниже вызове:

% корреляции (********, A2019, A2018, HouseValues, Houses, Value);

Это опечатка или я неправильно ее истолковал?

спасибо

...