加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.com/)- 科技、建站、内容创作、云计算、网络安全!
当前位置: 首页 > 数据库 > MsSql > 正文

如何在Teradata中执行动态SQL

发布时间:2020-07-09 06:39:58 所属栏目:MsSql 来源:互联网
导读:有没有办法向Teradata提交动态生成的SQL?我编写了一个查询,它将创建用于对表进行非规范化的代码.现在,我将代码拉到我的客户端(SAS)并在第二步重新提交.我不熟悉Teradata宏或程序;会有类似的工作吗? 为了说明,我有一个如下定义的表: create multiset table

有没有办法向Teradata提交动态生成的SQL?我编写了一个查询,它将创建用于对表进行非规范化的代码.现在,我将代码拉到我的客户端(SAS)并在第二步重新提交.我不熟悉Teradata宏或程序;会有类似的工作吗?

为了说明,我有一个如下定义的表:

create multiset table MYTABLE
    (  RECID  integer generated always as identity
              ( start with 1
               increment by 1
               minvalue -2147483647
               maxvalue 2147483647
               no cycle ),SNAP_DATE  date format 'YYYY/MM/DD',EMAIL_DATE date format 'YYYY/MM/DD',FREQ integer
    )
unique primary index ( RECID  )

该表每天填充(SNAP_DATE),用于监视另一个表中email_date的更改.以下查询返回我可以运行以创建非规范化视图的代码:

select RUN_THIS
from (
    select RUN_THIS,RN
    from (
        select 'select EMAIL_DATE ' (varchar(100)) as RUN_THIS,0 (int) as RN
          ) x

    union all
    select ',sum( case when SNAP_DATE = date '''
             || (SNAP_DATE (format 'yyyy-mm-dd') (char(10)) )
             || ''' then FREQ else 0 end ) as D'
             || (SNAP_DATE (format 'yyyymmdd') (char(8)) ) as RUN_THIS,row_number() over ( partition by 1 order by SNAP_DATE ) as RN
    from ( select distinct SNAP_DATE 
           from MYTABLE 
           where SNAP_DATE > current_date - 30) t1

    union all
    select RUN_THIS,RN
    from (
        select 'from MYTABLE group by 1 order by 1;' as RUN_THIS,10000 as RN
          ) y
    ) t
order by RN

我将上述查询的结果导出到我客户端上的文件,然后转身将该文件提交回Teradata.我希望有一些方法可以将这个完整的定义存储在一些Teradata对象中,以便可以直接执行.

解决方法

您可以使用DBC.SysExecSQL命令将此成功放入存储过程中.

以下是Teradata中存储过程的过度简化示例.显然,在生产中需要定义一个错误处理程序来解决无效数据库对象之类的问题.此外,您可以将SQLSTATE作为参数返回,以测试存储过程是否成功完成.

CREATE PROCEDURE SYSDBA.CommentDatabase
(
  IN P_Database VARCHAR(30),IN P_Comment VARCHAR(255),OUT MSG
)
MAIN:  --Label
BEGIN

  DECLARE  P_SQL_TEXT     VARCHAR(4000);

  SET P_SQL_TEXT='COMMENT ON DATABASE '||P_DBNAME||' AS '''||P_COMMENT||'''';
  CALL dbc.SysExecSQL (:P_SQL_TEXT);

  SET MSG = 'Database '||P_DBNAME||' commented successfully!';
END;

(编辑:阜阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读