基于GAPTEQ的物流系统多批量插入SQL语句实现方案问询
单条SQL实现根据选择插入对应数量的运输订单
你之前用CASE WHEN控制INSERT的写法无效,因为SQL中CASE是表达式,不能用来分支执行不同的DML语句。下面是几种可行的单条SQL方案,适配GAPTEQ的参数环境:
方法1:利用数字生成表+条件计数插入
通过将@Input_User转换为对应的插入行数,再生成对应行数的数据集,用INSERT SELECT批量插入。
方案A:依赖系统表生成行(简洁高效)
INSERT INTO dbo.table (row1, row2, row3) SELECT val1, val2, val3 FROM ( SELECT TOP ( CASE @Input_User WHEN '1 Palette' THEN 1 WHEN '2 Paletten' THEN 2 WHEN '3 Paletten' THEN 3 ELSE 0 -- 无效输入时不插入 END ) 1 AS Dummy FROM master..spt_values WHERE TYPE = 'P' -- 取内置整数序列 ) AS RowGenerator;
方案B:递归CTE生成行(无外部依赖)
如果不想依赖系统表,用递归CTE生成对应行数:
WITH RowGenerator AS ( SELECT 1 AS Counter UNION ALL SELECT Counter + 1 FROM RowGenerator WHERE Counter < ( CASE @Input_User WHEN '1 Palette' THEN 1 WHEN '2 Paletten' THEN 2 WHEN '3 Paletten' THEN 3 ELSE 0 END ) ) INSERT INTO dbo.table (row1, row2, row3) SELECT val1, val2, val3 FROM RowGenerator;
方法2:UNION ALL条件拼接(适合固定少量选项)
针对固定的1/2/3托盘选项,用UNION ALL结合WHERE条件,只执行符合当前选择的分支:
INSERT INTO dbo.table (row1, row2, row3) -- 插入第1条 SELECT val1, val2, val3 WHERE @Input_User IN ('1 Palette', '2 Paletten', '3 Paletten') UNION ALL -- 插入第2条(仅当选择2/3托盘时执行) SELECT val1, val2, val3 WHERE @Input_User IN ('2 Paletten', '3 Paletten') UNION ALL -- 插入第3条(仅当选择3托盘时执行) SELECT val1, val2, val3 WHERE @Input_User = '3 Paletten';
GAPTEQ适配注意事项
- 确保
val1/val2/val3是固定值或GAPTEQ提供的合法参数(比如会话变量、站点参数) - 如果GAPTEQ不支持DECLARE变量,直接把CASE逻辑嵌入到TOP或CTE的条件中即可
- 建议保留
ELSE 0的分支,避免无效输入时产生错误
内容的提问来源于stack exchange,提问作者SikorskyS60
相关产品推荐
相关产品推荐

