首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 預存程序實戰:字串分割與訂單明細批次寫入

     編輯:關於SqlServer

業務場景

前台傳入逗號分隔的字串參數 (餐桌號、菜單號、數量、備註等),預存程序需拆解後逐筆寫入訂單主檔與明細檔,支援團體/個人、套餐/單點多種模式。

核心邏輯架構

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 用暫存表/表變數)。

設計重點提醒

  • 參數長度上限 (NVARCHAR 4000) 限制單次筆數,大量資料建議改用 XML 或大量複製 (BCP)
  • 交易範圍盡量縮小,避免長時間鎖定
  • 錯誤處理需配合 @@ERROR 與 GOTO 模擬 TRY/CATCH
  • 單點/套餐、個人/團體四種組合邏輯複雜,建議拆分為多個子程序

此類「參數字串化」模式在早期 Web 表單提交常見,現代建議改用 Table-Valued Parameters (SQL 2008+) 或 JSON (SQL 2016+) 傳結構化資料,避免分割解析效能與維護成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved