2016-05-31 347 views
1

下面的腳本(FX是SQL Server的表):WHERE子句操作需要兼容的變量

LIBNAME SQL ODBC DSN='sql server' ; 

DATA new; 
    SET SQL.fx; 
    WHERE repo_date = '2016-04-29 00:00:00.000'; 
RUN; 


PROC PRINT DATA=new; 
RUN; 

返回我的錯誤(SAS日誌):

191  WHERE repo_date = '2016-04-29 00:00:00.000'; 
ERROR: WHERE clause operator requires compatible variables. 
192 RUN; 

我在哪裏可以檢查哪些數據轉換我需要(在這種情況下和其他人)?

在SQL Server 2008 R2中,repo_date是datetime列。

+1

'repo_date'數據類型是'datetime'嗎? – Arulkumar

回答

3

您正在比較字符串與數字值。 所以你的日期時間格式是錯誤的(如Heinzi提到的),也可以選擇將其轉換爲datetime值(通過在結尾處增加一個DT)

工作應該這樣:

WHERE repo_date ='29APR2016 00:00:00.000'dt; 

如果repo_time是日期時間,時間是不相關的,你可以比較日期:

WHERE datepart(repo_date) = '29APR2016'd; 
+1

'd'使它成爲日期,而不是日期。 'dt'使它成爲日期時間。 – Joe

+1

@Joe:奇怪的是,在我的sasbase中,d對於兩者都是有效的(而且時間也一樣)......但是我把它改成dt來完全正確。 – kl78

+0

WHERE repo_date ='29APR2016 00:00:00.000'的作品。 – PNPTestovir

2

SAS使用ODBC LIBNAME引擎SAS數據步碼轉換成SQL代碼。因爲您正在使用SAS編寫它,SAS假定您正在查找字符串2016-04-29 00:00:00.000。相反,你想把它放在一個SAS date literal,所以SAS知道如何翻譯數據。

LIBNAME SQL ODBC DSN='sql server' ; 

DATA new; 
    SET SQL.fx; 
    WHERE repo_date = '29APR2016:00:00:00'dt; 
RUN; 

PROC PRINT DATA=new; 
RUN; 

如果你在做SQL直通服務器上直接運行SQL,那麼你上面的代碼會工作。

proc sql noprint; 
    connect to odbc(datasrc='sql server'); 
     create table new as 
      select * from connection to odbc 
       (select * from schema.fx where repo_date='2016-04-29 00:00:00.000'); 
    disconnect from odbc; 
quit; 

基本上,上面所做的是讓SQL服務器拉列,然後SAS簡單地將它全部拉到自己。可以將其視爲使用SAS作爲代理程序,以直接在SQL服務器上運行命令。