我搜索过这种类型的错误Teradata Error" 5407 DateTime或Interval&#34的无效操作;这里和网上但找不到任何解决方案。
简单地说:我在Teradata中有一个简单的sproc,它有2个输入和1个输出。这是sproc:
Replace PROCEDURE SP.CompUserReturnID (
IN NTIDVar varchar(50),
IN CreatedDate TIMESTAMP(6),
OUT ReturnRes integer
)
BEGIN
DECLARE res varchar(1000);
DECLARE RetCompID integer;
DECLARE ReplaceNTIDVAR varchar(50);
-- In some cases, the NTIDVar contains the single quote ('). Example: John'O.Smith@company.com
-- so we need to replace the single quote
set ReplaceNTIDVAR = oreplace(NTIDVar,'''','''''');
set res = 'INSERT INTO tables.Computer (NTID, CreatedDate) VALUES (''' || ReplaceNTIDVAR || ''',' || CreatedDate ||') ';
EXECUTE IMMEDIATE res;
-- Do something else
set ReturnRes = res;
end;
执行这个简单的sproc时,我收到错误消息:
Teradata错误5407 DateTime或Interval
的操作无效
CreatedDate列在TD tabble中定义为TimeStamp(6)。
任何线索都将不胜感激。
由于
答案 0 :(得分:1)
错误是由此部分|| CreatedDate ||
引起的。连接需要字符串操作数,但CreatedDate
是时间戳,并且没有用于时间和时间戳的自动类型转换。
当您添加明确的|| CAST(CreatedDate AS VarChar(26)||
时,您会收到另一个错误,因为您传递给EXECUTE IMMEDIATE
的字符串必须是有效的语法,但您尝试执行:
INSERT INTO tables.Computer (NTID, CreatedDate) VALUES ('bla',2018-05-03 12:25:41.65000)
所以你需要引用时间戳(最好使用时间戳文字):
SET res = 'INSERT INTO Computer (NTID, CreatedDate) VALUES (''' || ReplaceNTIDVAR
|| ''', TIMESTAMP ''' || Cast( CreatedDate AS VARCHAR(25)) ||''') ';
最终会产生有效的语法:
INSERT INTO Computer (NTID, CreatedDate) VALUES ('bla', TIMESTAMP '2018-05-03 12:27:34.99000')
但是,没有理由使用动态SQL(易于SQL Injection),只需使用带参数的硬编码插页:
INSERT INTO Computer(NTID,CreatedDate)VALUES(:NTIDVar,:CreatedDate);
当然,您的最终SET ReturnRes = res;
也会失败,因为ReturnRes
是一个INT。