【问题标题】:Create table in SAS using DB2 timestamp使用 DB2 时间戳在 SAS 中创建表
【发布时间】:2017-01-19 19:35:25
【问题描述】:

我们最近在我们的 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.

尝试谷歌搜索并找到许多不同版本的答案,但我看不到与此相关的内容,最接近的是手动创建格式,但我不知道该怎么做。

有什么想法吗?

【问题讨论】:

  • USER 是您在 SAS 中定义的 libref 的名称还是远程 DB2 数据库中的数据库/模式的名称?您编写的语法是 SAS 代码,因此假设 USER 是 libref。如果要将代码推送到远程数据库,请使用 PROC SQL 中的 execute 语句。
  • 用户是我的windows用户,只是一种不泄露信息的方式:D
  • 使用您的用户名作为 libref 可能效果不佳,因为它可能超过 8 个字符。

标签: sql sas db2


【解决方案1】:

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

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= dataset 选项来告诉 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;

【讨论】:

    【解决方案2】:

    你不能:

     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 左右。

    【讨论】:

    • 好建议,但由于代码是写在问题中的,它不是使用 DB2 语法而是使用 SAS 语法(其中" 没有那个含义)。
    • 日期并不是真正的日期,是的,它是一个保留字。但是不,我得到了预期以下类型之一的语法错误.....
    【解决方案3】:

    这两行不协调:

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

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

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

    • 字符 | VARCHAR 表示列宽为width的字符列。默认列宽为 8 个字符。
    • 整数 | SMALLINT 表示整数列。
    • 十进制 |数字 | FLOAT )> 表示一个浮点列,列宽为width,ndec小数 地点。
    • 真实 | 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;
    

    但是,我建议您最好的选择是使用直通来创建表,因此您可以使用DB2 语法 - 因为您是在此处创建表,而不是在 SAS 本身中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      相关资源
      最近更新 更多