WHERE子句运算符需要兼容的变量

时间:2016-05-31 13:43:32

标签: sql-server sas

在脚本下面(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 列。

2 个答案:

答案 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服务器上运行命令。