2012-07-20 32 views
5

Teradata有一個名爲dbc.tables的有用視圖,可用於查詢對象。我用它來查看成功的視圖中的RequestText,但程序似乎編譯有點不同。我可以在Teradata中查詢過程的RequestText嗎?

當我看一個程序(TableKind P)的RequestText,我得到的是這樣的:

ALTER PROCEDURE '468137'xn.'546321987654321345646556213165468654654654'xn COMPILE /* mydb.procedurename */; 

這是對正在別處存儲的實際RequestText的參考?我如何得到它?

我想用SQL實際查詢它,而不是將其轉儲到文本文件。

之所以這樣,是因爲我需要運行LIKE語句來搜索對特定表名稱的引用。將它轉儲到文本文件然後手動搜索文本文件是不方便的。

回答

7

存儲過程被編譯爲可執行對象。在Windows上,它們被編譯成DLL。在Unix上,它們被編譯成共享對象。這些對象存儲在擁有的數據庫中。

Teradata Forums上提出了類似的問題。

查看原程序代碼

因爲他們是編譯原碼不會在我們地方,比如DBC.Tables可見的,所以很遺憾,你已經發現,對DBC.Tables以下查詢不會工作。

SELECT * 
FROM DBC.Tables 
WHERE TableKind = 'P' 
AND RequestText LIKE '%abc%'; 

相反,檢索存儲過程的代碼的唯一方法是執行以下操作:

SHOW PROCEDURE mydb.procedurename; 

如何找到包含指定

我會做的就是程序使用VBScriptVBA通過ODBC連接到Teradata。我會先運行此獲得所有存儲過程的列表:

SELECT * 
FROM DBC.Tables 
WHERE TableKind = 'P'; 

然後,我將通過每一個結果環路並運行以下,結果保存在VBA的變量。

SHOW PROCEDURE <dbname>.<tablename>; 

然後,我會使用類似InStr()功能查找當代碼包含文本的某些字符串。

當然,這是涉及到很多,我認爲你最初希望。

備用選項

另一種選擇是利用在DBQL數據庫表,如果是提供給你他們。

此數據庫包含一些「日誌記錄」表,您可以在其中查看系統上執行的所有SQL語句的歷史記錄。

這樣,您可以使用LIKE條件運行您最初希望使用的查詢類型。

+2

我最後寫一個.NET工具,做什麼你所說,它工作得很好。其他人可能從中受益的一個警告是,您必須將'show procedure mydb.mysproc'讀入TdDatareader,然後執行'while(reader.Read())',因爲sproc中的每行都是單獨的行。簡單地返回一個標量將只返回sproc的第一行。感謝您的建議。 – oscilatingcretin 2012-07-23 12:53:03

0

對於Teradata 14.1,SHOW PROCEDURE技巧可能並不總是適用,直到Teradata 15被測試;不知道最新版本。這是因爲對象名稱(即表,視圖,存儲過程等)現在可以具有超過30個字符的字符長度。如果對象名稱多於此,DBC.Tables視圖將無法檢索使用相等條件過濾的TABLENAME的記錄。可能需要使用「LIKE」關鍵詞修飾符。 DBC.Tables在視圖中具有SUBSTRING功能,仍然將名稱限制爲30.您仍然可以通過DBC.TVM獲取完整的對象/表名稱;但前提是您必須具有通常不受其他DBA授予的SELECT訪問權限。

最好的問候, 贏

+0

建議使用自TD12以來的新的基於Unicode的系統視圖集合,即「dbc.TablesV」而不是「dbc.Tables」。 – dnoeth 2016-03-30 09:04:40

+0

謝謝,dnoeth,分享這些信息。 – 2016-04-06 17:59:04

相關問題