2016-08-09 10 views
0

Ich habe das folgende Stück Code, der funktioniert, aber ich würde gerne wissen, ob jemand mit einem besseren Weg zum "Entfernen" der %nrquote kommen kann. Ich musste eine %SUBSTR Funktion hinzufügen, die funktioniert, aber ich bin gespannt zu wissen, ob es andere Vorschläge gibt, und wenn jemand helfen kann zu erklären, warum der Code ohne die %let Anweisung innerhalb der mvar Makrodefinition nicht funktioniert.Verbesserung auf% NRQUOTE 'Entfernung'

/* Automatically generated by DI Studio - cannot change */ 
%let _where_clause = %nrquote(name = %'Henry%'); 
%let _mac1 = %nrquote(lemk); 
%let _variable = weight; 
%let _input0 = sashelp.class; 
/* End of auto-generated code */ 

options mprint; 

%macro mvar; 
    %if &_where_clause ^= %then %do; 
     /* Re-assign the _where_clause variable to 'remove' %nrquote */ 
     %let _where_clause = %substr(&_where_clause,1); 
     where &_where_clause 
    %end; 
%mend mvar; 

proc sql; 
    select &_variable into :&_mac1 
    from &_input0 
    %mvar 
    ; 
quit; 

Ohne% vermietet Anweisung, schlägt der Code mit diesem Fehler:

NOTE: Line generated by the macro variable "_WHERE_CLAUSE". 
1  name = 'Henry' 
      - 
      22 
MPRINT(MVAR): where name = ' 
NOTE: Line generated by the macro variable "_WHERE_CLAUSE". 
1  name = 'Henry' 
      - 
      200 
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, 
       a numeric constant, a datetime constant, a missing value, (, *, +, -, ALL, ANY, 
       BTRIM, CALCULATED, CASE, INPUT, PUT, SELECT, SOME, SUBSTRING, TRANSLATE, USER. 

ERROR 200-322: The symbol is not recognized and will be ignored. 

114   ; 
MPRINT(MVAR): Henry' 
+1

Sieht aus wie ein Fehler in DI-Studio. Wenn sie die einfachen Anführungszeichen hinzufügen, sollten sie das resultierende Wertmakro nicht in Anführungszeichen setzen. – Tom

Antwort

2

Sie% UNQUOTE brauchen das ist, was mit% LET geschieht, ist es un-unter Angabe der zitierten Zitate.

Change 
where &_where_clause 
to 
where %unquote(&_where_clause)