Scripting

我怎樣才能讓對象定義中的所有註釋都被剝離?

  • March 9, 2017

當我想知道一個儲存過程或視圖是否引用給定名稱(表、視圖或列)時,我需要一個去除了所有註釋的對象定義版本。

這可以通過通常的 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 $$ 是

  1. sp_help proc_name
  2. 選擇$$ text $$FROM sys.syscomments WHERE OBJECT_NAME(id) = ‘proc_name’
  3. SELECT OBJECT_DEFINITION(OBJECT_ID(‘proc_name’))

第二個和第三個選項返回可用於 LIKE 子句的 varchar(max) 類型的列。

歷史註釋:

當 ’ *** =’ 和 ‘= *** ’ 過時時,syscomments 以 255 個字元的塊返回定義,並且可以將兩者放在不同的行中。

但是第二個問題還沒有解決。一些步履蹣跚的開發人員傾向於將舊程式碼保留為 C 風格的註釋,這使得掃描包含已棄用語法的程式碼變得困難。

您可以使用 T-SQL 和各種字元串函式來執行此操作,但您需要使用 /**/ 和 – 來說明註釋。

換句話說,沒有簡單的方法來取回刪除了所有註釋的儲存過程定義。您基本上需要建構自己的解析工具。

在 Oracle 中,當然可以在表或視圖級別進行確定。跟踪依賴關係,以便在發生 DDL 更改時使相關對象無效。

由於列需要與適當的表匹配,因此確定列級別的依賴關係可能會更加困難。視圖可以更改列名,因此需要更深入的跟踪。

留下評論的任何誤報可能表明需要修復評論。

引用自:https://dba.stackexchange.com/questions/1668