【问题标题】:Include With statement in Teradata procedure在 Teradata 过程中包含 With 语句
【发布时间】:2017-06-08 06:05:15
【问题描述】:

我正在尝试在包含 with/recursive 语句的 Teradata 数据库上创建一个过程,当我 CALL 该过程时,它给了我错误 "Expected something like a name or Unicode delimited identifier between ( and )"。我删除了所有不产生错误的代码,剩下的是:

REPLACE PROCEDURE 
--CALL
db.test()
BEGIN
-- calling proc bombs instead of inserting, running outside called proc ok
INSERT INTO db.tbl_lProcModKey
WITH b AS (
    SELECT      TransactionControlNumber, ClaimLineNo, modifier
    FROM        db.tbl_lMod)        
SELECT TransactionControlNumber, ClaimLineNo, NULL AS modKey FROM b;
END

在过程之外执行 SQL 助手中的代码运行正常。我假设这是我们在 VERSION 14.10.07.08 上的数据库的预期行为,但是是否有另一种方法可以将此类函数包含在计划进程中?我们希望尽可能使用 SSIS 包调用数据库上的代码,限制进入包的代码量。

感谢您提供的任何帮助。

【问题讨论】:

  • 我知道在旧版本的 SP 中不支持 WITH 子句,但我不记得它是什么时候添加的。显然在 14.10 之后 :( 当然你可以使用派生表重写它,除非它是 WITH RECURSIVE,但是你可以考虑将 SELECT 存储为递归视图。
  • 或者你也可以只嵌套选择

标签: stored-procedures teradata


【解决方案1】:

WITH 在存储过程中不受支持,即使在较新的版本中也是如此。以下是 16.10 文档(“SQL 数据操作语言”)的摘录:

您不能在任何这些数据库对象的定义中指定 WITH 或 WITH RECURSIVE 语句修饰符:

∘ 视图和递归视图

∘ 触发器

∘存储过程

∘派生表

【讨论】:

  • 似乎是文档中的一个错误 :-)
  • @dnoeth 为什么?我刚刚尝试在一个过程中使用带有WITH 的查询,它没有编译但没有过程它可以工作(我没有太多时间检查是否还有其他问题,但我怀疑)。我在 Teradata 16.10 上工作。
  • 你是对的 :-( 我在 SP 或触发器中从来不需要它,但至少 16.00 允许在视图和派生表中使用 CTE
猜你喜欢
  • 2012-07-30
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多