在脚本下面(fx是SQL Server的表):
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 2008R2中,repo_date是 datetime 列。
答案 0 :(得分:3)
您正在将字符串与数值进行比较。 所以你的datetime格式是错误的(比如Heinzi提到的),你还需要将它转换为日期时间值(通过在末尾添加一个dt)
应该这样做:
WHERE repo_date ='29APR2016 00:00:00.000'dt;
如果repo_time是datetime且时间不相关,您只需比较日期:
WHERE datepart(repo_date) = '29APR2016'd;
答案 1 :(得分: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 passthrough直接在服务器上运行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服务器上运行命令。