Stored Procedure 下載指南
這份文件說明如何從 SQL Server 批次匯出 Stored Procedure 和 Function。
流程
- 先抓出所有 SP 名稱。
- 把名稱存成清單檔
procedures.txt。 - 依清單逐支匯出 SP 定義。
- 使用
-y 0避免長文字被截斷。
Function 下載流程
Function 也可以用同樣方式匯出,只要把查詢來源改成 sys.objects 並限定 FN、TF、IF。
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 FunctionTF= Table-valued FunctionIF= 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.sqlsellout2pr_SP_NAME.sql
注意事項
- 清單中的物件名稱要保留
schema.object格式。 - 檔名會把
[、]、.轉成_。 - 如果某支 SP 沒有定義,輸出檔可能是空的。