Sql Teradata:如何从数据库表动态创建视图

Sql Teradata:如何从数据库表动态创建视图,sql,teradata,dynamic-sql,Sql,Teradata,Dynamic Sql,我使用的是Teradata BTEQ版本15.00。我有以下SQL代码。动态SQL就快到了,但是formet有点不对劲 .Export Report File = CViews.sql .Rtitle '' .Foldline on .Format Off .set heading ''; .set heading off; .set UNDERLINE OFF; .Omit On 4,5 Select CASE When ColNo = 1 THEN 'Replace Vi

我使用的是Teradata BTEQ版本15.00。我有以下SQL代码。动态SQL就快到了,但是formet有点不对劲

.Export Report File = CViews.sql

.Rtitle ''
 .Foldline on
 .Format Off
 .set heading '';
 .set heading off;
 .set UNDERLINE OFF;
 .Omit On 4,5

Select
 CASE When ColNo = 1
 THEN 'Replace View
$view_db_name.VW_'||Tbl.Tablename||' As locking row for access
Select ('
 Else '' END (Title '')
 , Cols.Columnname (Title '')
 , CASE WHEN RevColNo = 1 THEN ')
From $db_name.'||Tbl.Tablename||';'
 Else '' END (Title '')
 , Row_Number () Over(Partition By Tbl.Tablename
 Order By Cols.ColumnId) As ColNo
 , Row_Number () Over(Partition By Tbl.Tablename
 Order By Cols.ColumnId Desc) As RevColNo
 From DBC.Tables Tbl
 Join DBC.Columns Cols
 On Tbl.Databasename = Cols.Databasename
 And Tbl.Tablename = Cols.TableName
 Where Tbl.Databasename = '$db_name'
 And Tbl.Tablekind = 'T'
 Order By Tbl.Tablename, ColNo
 ;
.Export Reset

.Run File CViews.sql
下面是结果,但access的锁定行被切断,因此我在编译SQL时出错

Replace View  VIEWS_TEST.VW_LOCATION                   As loc
   ID
   LOC_TYPE_ID
   NAME
   LATITUDE
   LONGITUDE
   ADDR1
   ADDR2
   CITY
   STATE
   COUNTRY

   )  From TABLES_TEST.LOCATION                  ;
您可以看到As Loc被切断,因此我得到以下错误:

*** Failure 3707 Syntax error, expected something like a 'SELECT' keyword o
 r a 'LOCK' keyword or '(' or a 'TRANSACTIONTIME' keyword between the 'As' key word and the word 'loc'.
                Statement# 1, Info =81
 *** Total elapsed time was 1 second.
我尝试了不同的方法,试图让它工作,但失败了


有什么建议吗?

这是TD 15.00版的工作版本。
.Export Report File = CViews.sql
.set width 200
.Rtitle ''
 .Foldline on
 .Format Off
 .set heading '';
 .set heading off;
 .set UNDERLINE OFF;
 .Omit On 4,5

Select
 CASE When ColNo = 1
 THEN 'Replace View
$view_db_name.VW_'||Tbl.Tablename||' As locking row for access
Select ('
 Else '' END (Title '')
 , Cols.Columnname (Title '')
 , CASE WHEN RevColNo = 1 THEN ')
From $db_name.'||Tbl.Tablename||';'
 Else '' END (Title '')
 , Row_Number () Over(Partition By Tbl.Tablename
 Order By Cols.ColumnId) As ColNo
 , Row_Number () Over(Partition By Tbl.Tablename
 Order By Cols.ColumnId Desc) As RevColNo
 From DBC.Tables Tbl
 Join DBC.Columns Cols
 On Tbl.Databasename = Cols.Databasename
 And Tbl.Tablename = Cols.TableName
 Where Tbl.Databasename = '$db_name'
 And Tbl.Tablekind = 'T'
 Order By Tbl.Tablename, ColNo
 ;
.Export Reset

.Run File CViews.sql
我添加了missing,并更改为dbc.tablesV和dbc.ColumnsV

.os rm CViews.sql
.Export Report File = CViews.sql
.set width 300
.Rtitle ''
 .Foldline on
 .Format Off
 .set heading '';
 .set heading off;
 .set UNDERLINE OFF;
 .Omit On 4,5
Select
 CASE When ColNo = 1
 THEN 'Replace View
$view_db_name.VW_'||Tbl.Tablename||' As locking row for access
Select '
 Else ', ' END (Title '')
 , Cols.Columnname (Title '')
 , CASE WHEN RevColNo = 1 THEN '
From $db_name.'||Tbl.Tablename||';'
 Else '' END (Title '')
 , Row_Number () Over(Partition By Tbl.Tablename
 Order By Cols.ColumnId) As ColNo
 , Row_Number () Over(Partition By Tbl.Tablename
 Order By Cols.ColumnId Desc) As RevColNo
 From DBC.TablesV Tbl
 Join DBC.ColumnsV Cols
   On Tbl.Databasename = Cols.Databasename
  And Tbl.Tablename = Cols.TableName
 Where Tbl.Databasename = '$db_name'
   And Tbl.Tablekind = 'T'
   and Tbl.Tablename not like 'WRK_%'
   and Tbl.Tablename not like 'ZZ_%'
 Order By Tbl.Tablename, ColNo
 ;
.Export Reset

.Run File CViews.sql

因为您尚未设置宽度…请尝试将宽度设置为200或其他值。缺少的逗号错误可由其他“,”修复。切换到新的V视图dbc.TablesV和dbc.ColumnsV,旧的视图从TD12开始就不推荐使用,并将删除任何超过30个字符的表/列名。在表/列名中添加双引号以防止失败。我认为这个任务更适合于存储过程而不是BTEQ,它是2015:-。set width 200解决了SQL问题。现在,我将处理SQL中缺少的问题。@Dave请粘贴您现在得到的作为输出的内容。。以便我们可以对其进行改进。@Dave好的,我得到了它…但仅从bteq生成动态视图是很困难的。我的建议是,编写一个shell脚本来处理动态部分。将视图\u TEST.VW\u WRK\u位置替换为访问的loc king行选择ID loc\u类型\u ID名称经纬度ADDR1 ADDR2城市州国家ZIP联系人电话\u SPD传真电子邮件注释默认\u CUR From表2.试验地点;LATITUDE$***Failure 3707语法错误,在单词“LOC\u TYPE\u ID”和“NAME”关键字之间应为“,”。语句1,Info=139***总运行时间为1秒。因此,在列名之间缺少上述输出。我想我可以找到答案,明天发布正确的动态视图。戴夫