使用DB2时间戳在SAS中创建表

时间:2017-01-17 12:53:44

标签: sql sas db2

我们最近加速了我的DB2加速器(IDAA),我主要使用SAS访问它。

由于网络问题,这要求我们在插入行之前先创建表。

我的问题是创建一个具有正确时间戳格式的表,我可以使用select语句创建表,但这非常慢,但在这里我可以看到SAS中的格式是DATETIME30.6

但如果我尝试这样的话:

RSUBMIT prod_acc;
Proc delete data=user.table1; run; %PUT &sqlxrc &sqlxmsg; 
proc sql inobs=MAX stimer feedback noerrorstop;
 connect to db2(ssid=server);
 create table user.table1
(
            date datetime30.6
            ,reference char(16)
            ,transact char(20)
            ,alias char(60)
            ,amount decimal(15,2)
            ,currency char(3)
   );
%PUT &sqlxrc &sqlxmsg; 
quit;
run;

在日志中提供以下内容

 (
15               date datetime30.6
                      -----------
                      1         22
                                200
WARNING 1-322: Assuming the symbol DATE was misspelled as datetime30.

ERROR 22-322: Syntax error, expecting one of the following: a quoted string,
              an integer constant, ), ',', CHECK, DISTINCT, FORMAT, INFORMAT, LABEL, LEN,
              LENGTH, NOT, PRIMARY, REFERENCES, TRANSCODE, UNIQUE, ^, ~.

ERROR 200-322: The symbol is not recognized and will be ignored.

如果我查看DB2,该列的类型为timestmp,SAS不会将其识别为类型。

 (
31               date timestmp
                      --------
                      22
                      76
ERROR 22-322: Syntax error, expecting one of the following: CHAR, CHARACTER, DATE, DEC,
              DECIMAL, DOUBLE, FLOAT, INT, INTEGER, NUM, NUMERIC, REAL, SMALLINT, VARCHAR.

ERROR 76-322: Syntax error, statement will be ignored.

尝试使用Google搜索并找到了很多不同版本的答案,但我无法看到与此相关的内容,最接近的是手动创建格式,但我无法弄清楚如何做到这一点。< / p>

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

使用DATA步骤而不是PROC SQL定义表的结构在SAS中可能更自然。

data userdb.table1;
 stop;
 length date 8 reference $16 transact $20 alias $60 amount 8 currency $3 ;
 format date datetime30.6 amount 15.2 ;
run;

如果您的libref指向数据库,那么您应该能够使用DBTYPE=数据集选项告诉SAS哪些数据类型用于外部数据库中的字段。至少它适用于Teradata。这些数据集选项也应该在PROC SQL中工作。

proc delete data=userdb.table1; run;
data userdb.table1
(dbtype=
 ( date='timestamp'
   reference='varchar(16)'
   transact='varchar(20)'
   alias='varchar(60)'
   amount='decimal(15,2)'
   currency='char(3)'
 )
);
 stop;
 length date 8 reference $16 transact $20 alias $60 amount 8 currency $3 ;
 format date datetime30.6 amount 15.2 ;
run;

答案 1 :(得分:0)

你能不能:

 create table user.table1
 (
         "date" TIMESTAMP(6)
        ,reference char(16)
        ,transact char(20)
        ,alias char(60)
        ,amount decimal(15,2)
        ,currency char(3)
);

?请记住,在DB2中,date是一个保留字,然后将它放入双引号中总是安全的。或者,对列名称使用非保留字,例如dt左右。

答案 2 :(得分:0)

这两行不协调:

connect to db2(ssid=server);
create table user.table1

第一个为传递查询创建连接,而后者使用libname引擎创建表。在这种情况下,您的第一个陈述是无关紧要的,因为它没有被使用;你应该删除它(除非你以后使用它,并在你的例子中错误地将它留在里面)。

由于您使用了libname语法,因此必须遵循SAS语法而不是DB2。 create table语句中没有datetime类型的规范,特别是在column-definition文档页面下。相反,您有此列表可供选择:

  
      
  • CHARACTER | VARCHAR&lt;(宽度)&gt;表示列宽为宽度的字符列。默认列宽为八个字符。
  •   
  • INTEGER | SMALLINT表示整数列。
  •   
  • DECIMAL | NUMERIC | FLOAT&lt;(宽度&lt;,ndec&gt;)&gt;表示一个浮点列,列宽为宽度,ndec为十进制   地方。
  •   
  • REAL | DOUBLE PRECISION表示浮点列。
  •   
  • DATE表示日期列。
  •   

我最好指定日期时间(意思是,最有可能按预期工作)的方式不是使用date而是使用numeric,然后使用format参数来定义它作为日期时间。

proc sql;
  create table table1
    (       date num format=datetime30.6
            ,reference char(16)
            ,transact char(20)
            ,alias char(60)
            ,amount decimal(15,2)
            ,currency char(3)
   );
quit;

但是,我建议您的最佳选择是使用passthrough创建表格,因此您可以使用DB2语法 - 因为您在那里创建了一个表,而不是在SAS本身。