如何在SQL中引入变量来简化SQL语句,避免潜在的错误?
				
									
					
					
						|  | 
							admin 2025年9月28日 10:3
								本文热度 955 | 
					
				 
				我想将SQL Server的一个更新SQL统一一下共同的变量:
update scm_product_stock set sum_quantity=(select sum(quantity) as t_sum from scm_product_stock_list where operating_center_inner_id=100000 and product_code='CS01') where operating_center_inner_id=100000 and product_code='CS01';
update scm_product_stock set able_quantity=sum_quantity-out_quantity where operating_center_inner_id=100000 and product_code='CS01';
上面product_code='CS01'出现了3次,我想用一个变量代替,然后在最上面对这个变量进行赋值,下面的SQL调用这个变量,以避免出现多个位置时,忘了改掉其中一些位置造成SQL更新出错,要如何优化这个SQL?
 
您可以使用SQL Server的变量来统一管理这些公共值。以下是优化后的SQL:
-- 声明并设置变量
DECLARE @product_code VARCHAR(50) = 'CS01';
DECLARE @operating_center_inner_id INT = 100000;
-- 使用变量进行更新操作
UPDATE scm_product_stock 
SET sum_quantity = (
    SELECT SUM(quantity) 
    FROM scm_product_stock_list 
    WHERE operating_center_inner_id = @operating_center_inner_id 
    AND product_code = @product_code
) 
WHERE operating_center_inner_id = @operating_center_inner_id 
AND product_code = @product_code;
UPDATE scm_product_stock 
SET able_quantity = sum_quantity - out_quantity 
WHERE operating_center_inner_id = @operating_center_inner_id 
AND product_code = @product_code;
进一步优化建议:
如果您需要批量处理多个产品代码,可以使用表变量或临时表:
-- 方法1:使用表变量处理多个产品
DECLARE @products TABLE (
    product_code VARCHAR(50),
    operating_center_inner_id INT
);
INSERT INTO @products VALUES 
('CS01', 100000),
('CS02', 100000),
('CS03', 100000);
UPDATE s
SET s.sum_quantity = (
    SELECT SUM(quantity) 
    FROM scm_product_stock_list l
    WHERE l.operating_center_inner_id = p.operating_center_inner_id 
    AND l.product_code = p.product_code
),
s.able_quantity = s.sum_quantity - s.out_quantity
FROM scm_product_stock s
INNER JOIN @products p ON s.operating_center_inner_id = p.operating_center_inner_id 
    AND s.product_code = p.product_code;
或者使用单个UPDATE语句完成所有操作:
DECLARE @product_code VARCHAR(50) = 'CS01';
DECLARE @operating_center_inner_id INT = 100000;
UPDATE scm_product_stock 
SET sum_quantity = (
    SELECT SUM(quantity) 
    FROM scm_product_stock_list 
    WHERE operating_center_inner_id = @operating_center_inner_id 
    AND product_code = @product_code
),
able_quantity = (
    SELECT SUM(quantity) 
    FROM scm_product_stock_list 
    WHERE operating_center_inner_id = @operating_center_inner_id 
    AND product_code = @product_code
) - out_quantity
WHERE operating_center_inner_id = @operating_center_inner_id 
AND product_code = @product_code;
主要优点:
- 易于维护:只需修改变量值即可影响所有相关位置 
- 减少错误:避免遗漏修改某些位置 
- 提高可读性:SQL逻辑更清晰 
- 便于批量处理:可以轻松扩展为处理多个产品代码 
选择哪种方式取决于您的具体需求和使用场景。
该文章在 2025/9/28 10:09:36 编辑过