2012-01-05 105 views

回答

5

使用SYSCAT.COLUMNS catalog view

SELECT TABNAME 
FROM SYSCAT.COLUMNS 
WHERE 
    TABNAME IN ('table name 1', 'table name 2') AND 
    COLNAME = 'column_name'; 
8

在測試了DB2的z/OS 9.1和LUW 9.7:

SELECT STRIP(TBCREATOR) || '.' || STRIP(TBNAME) 
FROM SYSIBM.SYSCOLUMNS 
WHERE NAME = 'your_col' 
    AND TBNAME IN ('list', 'of', 'tables') 

如果你只是想從一個特定的模式的結果,你可能會添加AND TBCREATOR = 'your_schema'到的結束查詢。

+0

感謝您的回答,我確實希望檢查來自特定模式的表格。我嘗試添加你建議的那一行,但是這個任務沒有任何回報(我給了它一個我知道存在的列的名字)。 您可以請給我解釋一下查詢的工作原理嗎? 謝謝 – 2012-01-05 16:33:24

+0

對不起,錯字:任務是*請求 – 2012-01-05 16:39:59

+0

什麼可能會搞砸你的是你不添加架構到where子句的TBNAME'部分。比方說,你正在尋找一個名爲'UPDATE_TIMESTAMP'的列,它可能在'SCH.TAB1'或'SCH.TAB2'中,你認爲它可能在'SCH.TAB3'中(但事實並非如此)。你的查詢將是'SELECT STRIP(TBCREATOR)|| '' || STRIP(TBNAME) FROM SYSIBM.SYSCOLUMNS 其中name = 'UPDATE_TIMESTAMP' 和TBNAME IN( 'TAB1', 'TAB2', 'TAB3') AND TBCREATOR =「SCH'' – bhamby 2012-01-05 17:51:17

0

另一種方式做,這是錯誤處理:

declare v_sql varchar(1000); 
declare col_missing integer default 0; 
declare col_does_not_exist condition for sqlstate '42703'; 
declare continue handler for col_does_not_exist set col_missing = 1; 

set v_sql = 'select table.foo from table'; 
execute immediate v_sql; 

if col_missing = 1 then 
    --Do something if column foo doesn't exist. 
end if; 

這種方法將工作會話表,你也可以用它在物體上,即使你不知道它是否是一個表,視圖,別名等。

指定table.foo而不是列名稱很重要,否則稱爲foo的另一個對象(如變量)的存在會打破測試。

該繼續處理程序將屏蔽在該範圍內缺少的列的任何其他錯誤,因此最好將範圍限制爲您想要執行的測試。

相關問題