我在其中也有在SIT中使用大約600表的數據庫。在我們轉向UAT時,我需要比較SIT中與UAT中不同的表(列名,數據類型,大小)的DDL。我正在研究以下方法。 (我沒有PERM空間)我寧願在數據庫中這樣做,而不是導出數據並通過unix進行比較。在不同的服務器比較DDL表 - Teradata的,
第一種方法:
create volatile table SIT (s_tablename varchar(30), s_ddl varchar(30000)) on commit preserve rows;
create volatile table UAT (u_tablename varchar(30), u_ddl varchar(30000)) on commit preserve rows;
DATABASE SIT;
我怎麼能產生上述的DDL與SELECT語句插入到上面的數值?
1 SELECT 'SHOW TABLE ' || TRIM(TABLENAME) from dbc.tables where databasename='SIT' and tablekind='T' order by tablename;
如果我能有顯示錶即所得的,DDL與表名一起,我可以運行一個直接插入選擇到SIT表(類似下圖)
insert into SIT select trim(tablename <DDL_OF_TABLE> from dbc.tables where databasename='SIT' and tablekind='T'
進入UAT的數值是合適的,這樣我就可以按照下面的方式加入它們以找出差異。
select sit.s_tablename, uat.u_tablename from sit left join uat on sit.s_tablename = uat.u_tablename and sit.s_ddl=uat.u_ddl where uat.u_tablename is NULL;
第二種方法:
選擇從dbc.columns來自兩個如下坐和UAT所有列信息並且將它們在Excel工作表(SIT,UAT有兩種不同的服務器)進行比較。
SEL TABLENAME, COLUMNNAME, COLUMNFORMAT, COLUMNTYYPE, COLUMNLENGTH, NULLABLE, DECIMALTOTALDIGITS, DECIMALFRACTIONALDIGITS FROM DBC.COLUMNS WHERE DATABASENAME='SIT'ORDER BY TABLENAME, COLUMNNAME
2A) -
由於所得是巨大的(187000行 - 周邊600表),Excel表單正在非常長進行比較,並給所得到的。我可以將上述查詢分解成塊並進行比較。但是,我試圖在一部分中實現這一點。
2B) -
還有一個選項是導入上述選擇結果爲通過SQL助理易失性表(我沒有訪問運行實用程序),並下文做了減法運算。
sel * from SIT minus sel * from UAT;
但是,我覺得這是一個耗時的過程,通過SQL助手導入將大約187000行加載到2個易失性表中。另外,在上面的dbc.columns選擇過程中,我應該使用zeroifnull或其他函數來克服null處理,以避免出現任何進一步的問題。
能否請您闡述雙方的方法或任何更可行的解決方案的利弊?