我们最近加速了我的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>
有什么想法吗?
答案 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本身。