2016-04-06 19 views
0

PROC SQL'de düzgün çalışmak için bir makro değişkeni alıyorum sorun yaşıyorum ve bu bana mantıklı gelmiyor.Date makro değişkenini PROC SQL'de kullanma

Birincisi, böyle bir sorgu oluşturmak eğer: beklenen ve masanın sonunda bir tarih alanı koyar gibi çalıştığını

PROC SQL; 
SELECT 
    a.* 
    ,'31MAR2016' As EVAL_DATE format=date09. 
FROM 
    myTable a 
; 

. Eğer bunu yaparsam

Sonra:

%Let Eval_Date = %sysfunc(intnx (month,%sysfunc(inputn(201603,yymmn6.)) ,0,E),date09.); 
%Let Eval_date_test = %str(%')&Eval_Date.%str(%')d; 
%Put Eval_date_test; 

PROC SQL; 
SELECT 
    a.* 
    ,&Eval_date_test As EVAL_DATE format=date09. 
FROM 
    myTable a 
; 
: Bunu yaparsanız,

'31MAR2016'd 

Ama:

%Let testDate = '31MAR2016'd; 
%put &testDate; 

PROC SQL; 
SELECT 
    a.* 
    ,&testDate As EVAL_DATE format=date09. 
FROM 
    myTable a 
; 

bu yine değerini gösteren log penceresi ile düzgün çalışır

SAS, hatayla çalışmayı durdurur;

"HATA 22-322 : Yazım hatası, aşağıdakilerden birini bekliyor: bir isim, bir alıntı dize, sayısal sabit, bir datetime sabiti, kayıp değeri, (*, +, -, BTRIM HESAPLANABİLİR CASE, MEVCUT, gİRİŞ dEĞİL, SUBSTRING, TRANSLATE, KULLANICI, ^, ~ PUT

HATA 200-322.:. sembol tanınmaz ve göz ardı edilecektir"

log değeri görüntüler & Eval_date_test'in aynı olması için '31MAR2016'd ikinci örnekte olduğu gibi.Açıklık için iki adımda değişkeni yarattığımı unutmayın, ancak aynı adımı tek adımda oluşturursanız da olur.

Önemli olması durumunda, SAS Enterprise Kılavuzu'nu çalıştırıyorum.

+0

Neden tek tırnak alıntı makro kullanıyorsunuz? Neden sadece normal çift tırnak kullanmıyorsunuz? %% Eval_Date = "% sysfunc (intnx (ay,% sysfunc (inputn (201603, yymmn6.)), 0, E), date9)" d; – Tom

+0

@Tom tek ve çift tırnak. Yani tek tırnak makrolar içindir ve çift tırnaklar makrolar bağlamında normal karakterler olarak ele alınırken dizeleri sınırlamak için kullanılırlar. – OpiesDad

+1

SAS, hangisinin kullandığınızı umursamıyor, ancak tek tırnakların içindeki metinler makro tetikleyiciler için değerlendirilmiyor. Yani '& eval_date' 'makro değişken referansını çözmez ve' '& eval_date' 'yapar. – Tom

cevap

0

Bir sonra virgül eksik. *

+1

Buna baktığınız için teşekkür ederiz. Bunu yazmak için sorguyu basitleştirdiğimde, bu bir transkripsiyon problemiydi. Virgül, gerçek sorguda bulunur. Soruyu virgül içerecek şekilde düzenledim. – OpiesDad

1

Sen çok çok çalışkan ve sadece kafa karıştırıcı zavallı SAS edilir. Makro teklifini kullanmak yerine, başlamak için doğru alıntı karakterlerini kullanın. SAS hangi alıntı karakterlerini kullandığınızı umursamıyor, ancak tek tırnakların içindeki metin makro tetikleyiciler için değerlendirilmiyor ve çift tırnak içinde metin bulunuyor. Yani '&eval_date'd, makro değişken başvurusunu çözümlemez ve "&eval_date"d yapar.

%let Eval_Date="%sysfunc(intnx(month,%sysfunc(inputn(201603,yymmn6)),0,E),date9)"d;