2016-02-25 43 views

回答

1

你好ACCESS_GRANTED,

你是在正確的軌道上。你在給RawFocus的評論中說,「它像套接字服務器一樣運行」,並在你的問題「保持TCP連接」。你可以用一些聰明的編程來實際地實現SAS。

SAS套接字服務器: 這裏是一個宏語言的SAS服務器,永遠循環到 對請求做出響應。值得注意的是,在等待 下一個請求時,服務器處於睡眠狀態,其主機上的資源非常少。

/* Port as input parameter */ 
%let portno= &sysparm; 
%* let portno= 001; 
%do %while (1); 
filename in_msg SOCKET " :&portno" 
SERVER; 
filename temp_pgm "%sysfunc(pathname(work))/a-ready.sas" ; 
data _null_; 
infile in_msg; 
file temp_pgm; 
input ; 
put _infile_; 
run; 
filename in_msg; 
/* Before execution, server can choose to 
parse it first */ 
%inc temp_pgm; 
run; 
filename temp_pgm; 
%end; 

該客戶端提供有SAS服務器的IP地址,要調用的端口號以及要執行的服務器的程序文件。它能夠向已知的可用SAS服務器發送一個請求。還要注意,客戶端負責指導服務器在哪個端口發回結果(如果需要)。

%let host= IP-address-for-server-machine; 
%let portno= 001; 
filename to_servr SOCKET 「 &host:&portno」 ; 
filename input ‘SAS-program-to-be-run-onserver.sas’; 
/* Simple scheme to come up with a different port 
number to accept response from the server */ 
%let ret_port= %eval(&portno + 1); 
data _null_; 
file to_servr; 
infile input end= EOF; 
if _n_ = 1 then do; 
/* Required info for the server to return results 
back to this client */ 
put ‘%let ret_port= ’ 「 &ret_port;」 ; 
put ‘%let client= IP-address-for-clientmachine;’; 
end; 
input ; 
put _infile_; 
run; 
filename input; 
filename to_servr; 
/* Receiving socket for the results */ 
filename back_rst SOCKET 「 :&ret_port」 SERVER; 
data null_; 
infile back_rst; 
file print; 
input ; 
put _infile_; 
run; 
filename back_rst; 

來源:http://www2.sas.com/proceedings/sugi24/Coders/p083-24.pdf

順便問一下,你也可以考慮重新配置SAS服務器,如果可能的。 30秒開始會話有點長,尤其是批量會話。

+0

這絕對是我一直在尋找! SAS TCP服務器從客戶端讀取代碼並在到達時執行它。僅將我的響應窗口縮短至幾秒鐘。只需要一些創意編碼就可以了。 –

+0

@access_granted我很高興你喜歡這個答案。如果您對此感到滿意,請接受它:-) –

0

如果你很高興爲他們在同一個SAS連續運行會議,你可以只創建一個SAS腳本來執行其他腳本..

options source2; /* puts the contents of the sas files below in the log */ 
%inc "C:\MyLoc\script1.sas"; 
%inc "C:\MyLoc\script2.sas"; 
%inc "C:\MyLoc\script3.sas"; 

的這種方法的缺點是你的程序必須適當處理前面運行的任何剩餘的工作表/宏/宏變量等(它們不會有乾淨的會話)。

+0

當您在執行時準備好這些腳本時,這將起作用。 但是當我有一個sas文件時,我正在研究這種情況,然後在15分鐘內發現另一個 - 比方說。因此,由於本地SAS運行 - 看起來像一個套接字服務器 - 我想知道是否有辦法執行對先前打開的連接的第二個sas文件。 類似於 - 如果您打開SAS GUI客戶端,請執行第一個代碼,然後粘貼新的sas代碼以進行第二次執行。 –

+0

我想我明白你在做什麼(在現有的本地基礎sas會話中運行一個新的.sas程序),但是如果你可以更新你的問題以顯示你現在如何調用你的程序,這將會有所幫助 –

+0

我想到了一些東西Vassili寫道,只是不確定服務器/客戶端接口是否存在於sas中。使用他的代碼示例,我幾乎可以運行配套的tcp客戶端,並將sas代碼發送給父機器,因此 - 爲每個下一個腳本省略了sas環境啓動的必要性,因爲服務器運行在無限循環。 –