前台傳入逗號分隔的字串參數 (餐桌號、菜單號、數量、備註等),預存程序需拆解後逐筆寫入訂單主檔與明細檔,支援團體/個人、套餐/單點多種模式。
CREATE PROCEDURE procInsertOrderInfoOrderList
@Did NVARCHAR(1000), -- 餐桌號字串 (團體時多筆)
@Mid NVARCHAR(4000), -- 菜單號/套餐號字串
@Onum NVARCHAR(4000), -- 數量字串
@Onume INT, -- 實做人數
@Uid INT, -- 服務員編號
@OremarkList NVARCHAR(4000), -- 備註字串
@Oflag BIT, -- 0=單點 1=套餐
@Nstatus BIT -- 0=個人 1=團體
AS
BEGIN
-- 宣告變數 (略)
-- 核心流程:
-- 1. 解析 @Did 拆分餐桌號迴圈
-- 2. 每張桌建立訂單主檔 (取同一訂單號 @OrderInfoDid)
-- 3. 解析 @Mid/@Onum/@OremarkList 對應拆分明細
-- 4. 依 @Oflag 判斷寫入單點明細或套餐明細
-- 5. 處理相同菜品合併數量 (@count2)
-- 6. 交易控制確保一致性
END
SQL Server 2000 無 STRING_SPLIT,常用做法:
-- 迴圈配合 CHARINDEX/SUBSTRING 逐段切割
DECLARE @pos INT, @token NVARCHAR(100)
WHILE LEN(@str) > 0 BEGIN
SET @pos = CHARINDEX(',', @str)
IF @pos = 0 SET @pos = LEN(@str) + 1
SET @token = SUBSTRING(@str, 1, @pos - 1)
-- 處理 @token
SET @str = SUBSTRING(@str, @pos + 1, LEN(@str))
END
或建立通用分割函數回傳資料表變數 (SQL 2000 用暫存表/表變數)。
@@ERROR 與 GOTO 模擬 TRY/CATCH此類「參數字串化」模式在早期 Web 表單提交常見,現代建議改用 Table-Valued Parameters (SQL 2008+) 或 JSON (SQL 2016+) 傳結構化資料,避免分割解析效能與維護成本。