【问题标题】:Parameters and teradata Dynamic SQL参数和 teradata 动态 SQL
【发布时间】:2014-11-21 15:17:05
【问题描述】:

我试图在我的动态 sql 查询中使用一个参数,但无法让它工作。我简化了我的代码以仅突出显示我正在努力的部分。

我首先创建“t1”,然后将记录插入其中。

创建易失性表 t1 as(

选择日期 '1900-01-01' 作为 date_col

) 提交保留行的数据;

第一个程序运行良好,并插入给定的日期 (2014-01-01)。

替换过程 mi_table.dynamic_param()

开始

调用 DBC.SYSEXECSQL(

'插入t1

选择日期'||'''2014-01-01'''||' ;'

);

结束;

我真正想做但不工作的事情是这样的:

替换过程 mi_table.dynamic_param() 开始

声明 max_avail_date 日期;

set max_avail_date = (select period_dt from db.table) ;

调用 DBC.SYSEXECSQL(

'插入t1 选择'||:max_avail_date||' ;'

);

结束;

这是行不通的。似乎从“(从 db.table 中选择 period_dt)”返回的内容是“yy/mm/dd”格式。感谢以下建议,我想出了以下(非优雅)解决方案:

每当我想使用 max_avail_date 时,我都会使用 cast((cast('''||'20'||'''||'''||max_avail_date||''' as int)-19000000) as date)。

它可以完成这项工作,但我确信有更好的方法:)

于 2014 年 9 月 27 日下午 6:50 编辑

【问题讨论】:

    标签: stored-procedures parameters teradata dynamic-sql


    【解决方案1】:

    “不起作用”不是一个非常精确的错误描述:-)

    您可能收到“无效日期”消息?

    strSQL 中连接的字符串必须是有效的 SQL 语句,你的结果是

    insert into t1 select date 2014-01-01 ;
    

    这将起作用:

    replace procedure mi_table.dynamic_param() begin
    
    declare max_avail_date date;
    
    set max_avail_date = date '2014-01-01' ;
    
    CALL DBC.SYSEXECSQL(
    'insert into t1 select '''||:max_avail_date||''' ;'
    
    );
    
    end;
    

    编辑:

    关于 'yy/mm/dd' 格式的问题,这可能是由于您系统上的全局默认设置。你最好隐式分配一个 FORMAT:

    CALL DBC.SYSEXECSQL(
    'insert into t1 select '''|| (:max_avail_date (FORMAT 'yyyy-mm-dd'))||''' ;'
    
    );
    

    【讨论】:

    • 奇怪,我无法让set max_avail_date = date '2014-01-01' ; 工作,我想我一定是胖手指了。
    • 非常感谢您的回答。另外,好点,我没有说什么不起作用。老实说,我不认识自己。我做了更多的测试,现在我想我知道问题出在哪里了。让我编辑我的初始帖子。在简化查询时,我摆脱了我认为刚刚确定为关键元素的内容。
    【解决方案2】:

    这应该可行:

    declare max_avail_date varchar(10);
    declare strSQL varchar(2000);
    set max_avail_date = '2014-01-01';
    set strSQL = 'insert into t1 select  (date''' || max_avail_date || ''')';
    CALL DBC.SYSEXECSQL(:strSQL);
    

    我永远无法让它按照您尝试的方式工作。这一点让我很生气: set max_avail_date = date '2014-01-01' ; 我认为尝试在 set 语句中使用强制转换是行不通的。

    将其设置为字符串并在 select 语句中将其转换为日期可以正常工作。

    【讨论】:

      猜你喜欢
      • 2016-11-03
      • 2011-04-30
      • 2017-09-18
      • 1970-01-01
      • 2012-12-03
      • 2013-03-20
      • 2017-06-15
      • 2018-10-18
      • 2016-08-20
      相关资源
      最近更新 更多