方案 A:將中間值/SQL 插入臨時表,需動態拼接 EXEC('...'),注意變量拼接寫法:
EXEC('UPDATE SupplyplanLack SET Completedate = GetDate()
FROM supplyPlanLack a
WHERE ' + @ssTmp + ' AND ' + @iCompleteQty + ' >= (
SELECT s.RequestQty * a.RationQty AS ReQQty
FROM Balance a, SupplyPlan s
WHERE a.Vehicle = s.Vehicle
AND a.Part = s.Part
AND a.SupplyPlanNo = s.SupplyPlanNo
AND ' + @ssTmp + ')')
方案 B:PRINT 輸出,必須先轉字符型,否則報類型轉換錯誤:
PRINT CONVERT(VARCHAR(11), @spNOTo)
模式 1:自定義返回碼 + GOTO
SET @exec_num = 0
IF (@spNOFrom = 0 OR @spNOTo = 0 OR @reuseUser IS NULL)
BEGIN
SET @exec_num = 1
GOTO the_end
END
the_end:
RETURN
模式 2:RAISERROR 即時終止
SET NOCOUNT ON
IF (@property IS NULL) OR (@property = '')
BEGIN
RAISERROR('Must specify a property name.', -1, -1)
RETURN (1)
END
模式 3:檢查 @@ERROR 全局變量,在關鍵語句後立即判斷,非零則回滾/返回。
Oracle 有成熟 GUI 調試器,體驗較好;SQL Server 多依賴「臨時表記錄法」與「PRINT 大法」。錯誤處理上,SQL Server 推薦 RAISERROR 配合 TRY...CATCH(SQL 2005+),舊版本用 @@ERROR 捕獲;Oracle 則用 EXCEPTION 區塊統一處理。