Stored Procedure 下載指南

這份文件說明如何從 SQL Server 批次匯出 Stored Procedure 和 Function。

流程

  1. 先抓出所有 SP 名稱。
  2. 把名稱存成清單檔 procedures.txt
  3. 依清單逐支匯出 SP 定義。
  4. 使用 -y 0 避免長文字被截斷。

Function 下載流程

Function 也可以用同樣方式匯出,只要把查詢來源改成 sys.objects 並限定 FNTFIF

1. 先抓 Function 名稱

$functions = ssql -env fcst_dev -Q "SET NOCOUNT ON; SELECT QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) FROM sys.objects WHERE type IN ('FN','TF','IF')" -h-1

2. 存成清單

$functions | Set-Content -LiteralPath 'D:\SPs\functions.txt'

3. 依清單匯出每支 Function

$outputFolder = 'D:\SPs'
$functions = Get-Content -LiteralPath "$outputFolder\functions.txt" | ForEach-Object { $_.Trim() } | Where-Object { $_ }

foreach ($fn in $functions) {
    $safeFn = $fn.Replace("'", "''")
    $fileName = ($fn.Replace('[','').Replace(']','').Replace('.','_')) + '.sql'

    ssql -env fcst_dev -Q "SET NOCOUNT ON; SELECT m.definition FROM sys.sql_modules m JOIN sys.objects o ON m.object_id = o.object_id WHERE o.type IN ('FN','TF','IF') AND o.object_id = OBJECT_ID('$safeFn')" -y 0 -o "$outputFolder\$fileName"
}

4. 注意事項

  • FN = Scalar Function
  • TF = Table-valued Function
  • IF = Inline Table-valued Function
  • -h-1-y 0 一樣重要

1. 先抓 SP 名稱

$procedures = ssql -env fcst_dev -Q "SET NOCOUNT ON; SELECT QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) FROM sys.procedures" -h-1

-h-1 很重要,因為這個 ssql wrapper 會把 -h 當成 help。

2. 存成清單

$procedures | Set-Content -LiteralPath 'D:\SPs\procedures.txt'

3. 依清單匯出每支 SP

$outputFolder = 'D:\SPs'
$procedures = Get-Content -LiteralPath "$outputFolder\procedures.txt" | ForEach-Object { $_.Trim() } | Where-Object { $_ }

foreach ($sp in $procedures) {
    $safeSp = $sp.Replace("'", "''")
    $fileName = ($sp.Replace('[','').Replace(']','').Replace('.','_')) + '.sql'

    ssql -env fcst_dev -Q "SET NOCOUNT ON; SELECT m.definition FROM sys.sql_modules m JOIN sys.objects o ON m.object_id = o.object_id WHERE o.type='P' AND o.object_id = OBJECT_ID('$safeSp')" -y 0 -o "$outputFolder\$fileName"
}

4. 為什麼要 -y 0

m.definition 是長文字欄位,預設輸出可能被截斷。

-y 0 會取消長度限制,確保完整輸出到檔案。

產出結果

每支 SP 會輸出成一個 .sql 檔,例如:

  • dbo_sp_name.sql
  • sellout2pr_SP_NAME.sql

注意事項

  • 清單中的物件名稱要保留 schema.object 格式。
  • 檔名會把 []. 轉成 _
  • 如果某支 SP 沒有定義,輸出檔可能是空的。