Scripting
我怎樣才能讓對象定義中的所有註釋都被剝離?
當我想知道一個儲存過程或視圖是否引用給定名稱(表、視圖或列)時,我需要一個去除了所有註釋的對象定義版本。
這可以通過通常的 DBMS 系統中的 SQL 查詢來實現嗎?
編輯:
對於 SQL Server,我發現此解決方案使用
$$ Microsoft.Data.Schema.ScriptDom.Sql $$. 這是最小的 PowerShell 程式碼:
$sql = @' select * from PowerShell -- a comment where psRefnr = 1 '@ $options = new-object Microsoft.Data.Schema.ScriptDom.Sql.SqlScriptGeneratorOptions $sr = new-Object System.IO.StringReader($sql) $sg = new-object Microsoft.Data.Schema.ScriptDom.Sql.Sql100ScriptGenerator($options) $parser = new-object Microsoft.Data.Schema.ScriptDom.Sql.TSQL100parser($true) $errors = $null $fragment = $parser.Parse($sr,([ref]$errors)) $out = $null $sg.GenerateScript($fragment,([ref]$out)) $out
這種方法的優點是它使用了官方的微軟解析器。
第三次編輯:
在 T-SQL 中獲取過程定義的基本方法如前所述
$$ here $$$$ 1 $$ 是
- sp_help proc_name
- 選擇$$ text $$FROM sys.syscomments WHERE OBJECT_NAME(id) = ‘proc_name’
- SELECT OBJECT_DEFINITION(OBJECT_ID(‘proc_name’))
第二個和第三個選項返回可用於 LIKE 子句的 varchar(max) 類型的列。
歷史註釋:
當 ’ *** =’ 和 ‘= *** ’ 過時時,syscomments 以 255 個字元的塊返回定義,並且可以將兩者放在不同的行中。
但是第二個問題還沒有解決。一些步履蹣跚的開發人員傾向於將舊程式碼保留為 C 風格的註釋,這使得掃描包含已棄用語法的程式碼變得困難。
您可以使用 T-SQL 和各種字元串函式來執行此操作,但您需要使用 /**/ 和 – 來說明註釋。
換句話說,沒有簡單的方法來取回刪除了所有註釋的儲存過程定義。您基本上需要建構自己的解析工具。
在 Oracle 中,當然可以在表或視圖級別進行確定。跟踪依賴關係,以便在發生 DDL 更改時使相關對象無效。
由於列需要與適當的表匹配,因此確定列級別的依賴關係可能會更加困難。視圖可以更改列名,因此需要更深入的跟踪。
留下評論的任何誤報可能表明需要修復評論。