在 SQL Server 2000 企業管理器與查詢分析器中,無需等待完整部署即可驗證視圖、預存程序、動態 SQL 的語法與邏輯正確性,大幅提升開發效率。
企業管理器對所有可程式化物件 (觸發器、使用者定義函數、預設值、規則、檢查條件) 均提供相同的解析/執行驗證功能。
-- 工具列:查詢 → 僅解析 (Ctrl+F5)
-- 或腳本開頭加入:
SET PARSEONLY ON;
-- 後續所有批次僅語法檢查,不執行
SELECT * FROM NonExistentTable; -- 只會報語法錯誤,不會報物件不存在
SET PARSEONLY OFF;
-- 開啟實際執行計畫 (Ctrl+M)
-- 開啟統計資訊
SET STATISTICS IO ON; -- 邏輯/實體讀取次數
SET STATISTICS TIME ON; -- CPU/經過時間
SET STATISTICS PROFILE ON; -- 詳細運算子統計
SELECT * FROM Orders WHERE CustomerID = 'ALFKI';
-- 輸出範例:
-- Table 'Orders'. Scan count 1, logical reads 5, physical reads 0, read-ahead reads 0.
-- CPU time = 0 ms, elapsed time = 1 ms.
-- 使用 sp_executesql 驗證動態 SQL (防注入、計畫重用)
DECLARE @SQL NVARCHAR(MAX) = N'SELECT * FROM Orders WHERE OrderDate >= @Date';
DECLARE @ParamDef NVARCHAR(500) = N'@Date DATE';
-- 解析驗證
SET PARSEONLY ON;
EXEC sp_executesql @SQL, @ParamDef, @Date = '2024-01-01';
SET PARSEONLY OFF;
-- 實際執行
EXEC sp_executesql @SQL, @ParamDef, @Date = '2024-01-01';
| 錯誤類型 | 典型訊息 | 原因 | 解決方向 |
|---|---|---|---|
| 語法錯誤 | Incorrect syntax near '...' | 關鍵字拼寫、括號不匹配、保留字未加括號 | 檢查報錯位置前後、使用代碼編輯器語法高亮 |
| 物件不存在 | Invalid object name '...' | 表/視圖/程序名稱錯誤、Schema 前綴缺失、資料庫內容錯誤 | 確認 USE 正確資料庫、加上 Schema (dbo.)、檢查 sys.objects |
| 欄位名稱錯誤 | Invalid column name '...' | 欄位拼寫錯誤、別名在 WHERE/GROUP BY 中不可用 | 使用子查詢/CTE 重用別名、檢查 sys.columns |
| 型別轉換失敗 | Conversion failed when converting... | 隱含轉換溢位、字串非數值格式、日期格式不符 | 使用 TRY_CAST/TRY_CONVERT (2012+)、明確 CONVERT 風格 |
| 權限不足 | SELECT permission denied... | 使用者無 SELECT/EXEC 權限、跨資料庫存取未授權 | GRANT 權限、簽署程序、跨資料庫所有權鏈 |
| 字串截斷 | String or binary data would be truncated | INSERT/UPDATE 欄位長度不足、隱含轉換截斷 | 檢查欄位定義長度、使用 LEFT/RIGHT 截取、ANSI_WARNINGS OFF |
-- 驗證目錄下所有 .sql 檔案語法
-- 需啟用 xp_cmdshell (需 sysadmin)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
DECLARE @Cmd VARCHAR(8000) = 'for %f in (C:\Scripts\*.sql) do sqlcmd -S . -E -i "%f" -b -o "C:\Logs\%~nf.log"';
EXEC xp_cmdshell @Cmd;
-- 檢查錯誤日誌
-- 每個 .log 檔案若包含 "Msg" 開頭行即有錯誤