数据库优化提速(一)之进销存库存管理—仙盟创梦IDE

从存储过程到通用 SQL:进销存系统的数据操作优化

在进销存系统的开发与维护中,数据库查询语句的编写方式对系统的性能、兼容性和可维护性有着深远影响。本文将围绕给定的三段 SQL 代码展开,深入探讨将存储过程转换为通用 SQL 在进销存场景下的诸多好处,同时对字段进行中文转换以满足发表和隐私需求。

原始存储过程剖析

原始的 SQL 存储过程代码如下:

sql

$sql = "exec sp_executesql N'SELECT 库存ID, 库存编码, RTRIM(库存名称) AS 库存名称,  -- 去除中文字段尾部空格RTRIM(库存类别) AS 库存类别,RTRIM(库存款式) AS 库存款式,RTRIM(库存规格) AS 库存规格,ISNULL(门店成本, 库存成本) AS 库存成本, 期初数量, 增加数量, 减少数量, (期初数量 + 增加数量 - 减少数量) AS 总数量 FROM (SELECT 库存主表.库存ID AS 库存ID, 库存主表.库存编码 AS 库存编码, 库存主表.库存名称 AS 库存名称, 库存主表.库存类别 AS 库存类别, 库存主表.库存款式 AS 库存款式, 库存主表.库存规格 AS 库存规格, 库存主表.库存成本 AS 库存成本, (SELECT 库存成本 FROM 库存门店成本 WHERE 库存门店成本.库存ID = 库存主表.库存ID AND 库存门店成本.分店 = @仓库) AS 门店成本, SUM(CASE WHEN (库存凭证.出入库 = 1 OR 库存凭证.出入库 = -1) AND 库存凭证.生效日期 < @开始日期 THEN 库存凭证明细.数量 * 库存凭证.增减标识 ELSE 0 END) AS 期初数量, SUM(CASE WHEN 库存凭证.出入库 = 1 AND 库存凭证.生效日期 >= @开始日期 AND 库存凭证.生效日期 <= @结束日期 THEN 库存凭证明细.数量 * 库存凭证.增减标识 ELSE 0 END) AS 增加数量, SUM(CASE WHEN 库存凭证.出入库 = -1 AND 库存凭证.生效日期 >= @开始日期 AND 库存凭证.生效日期 <= @结束日期 THEN 库存凭证明细.数量 * 库存凭证.增减标识 * -1 ELSE 0 END) AS 减少数量 FROM 库存凭证, 库存凭证明细, 库存主表 WHERE 库存凭证.凭证ID = 库存凭证明细.主表ID AND 库存凭证明细.库存ID = 库存主表.库存ID AND 库存凭证.状态 = @状态 AND 库存凭证.仓库 LIKE @仓库 GROUP BY 库存主表.库存ID, 库存主表.库存编码, 库存主表.库存名称, 库存主表.库存类别, 库存主表.库存款式, 库存主表.库存规格, 库存主表.库存成本) AS 库存数据 ORDER BY 库存编码',N'@状态 int, @开始日期 datetime, @结束日期 datetime, @仓库 nvarchar(4)',@状态 =?, @开始日期 =?, @结束日期 =?, @仓库 =? ";

此存储过程通过 sp_executesql 执行动态 SQL,用于从进销存相关的多张表(库存主表、库存门店成本表、库存凭证表、库存凭证明细表)中获取特定时间段和仓库的库存数据,包括库存 ID、编码、名称、类别、款式、规格、成本以及不同时间段的数量变化情况。通过参数化查询,使得该存储过程在不同条件下具有一定的灵活性。

转换为通用 SQL 的过程及优势

  1. 消除特定数据库依赖,提升兼容性:许多数据库系统虽然支持存储过程,但语法和特性存在差异。将存储过程转换为通用 SQL,可以避免依赖特定数据库的存储过程执行机制,如 sp_executesql 是 SQL Server 特定的语法。转换后的通用 SQL 可以在更多类型的数据库系统中运行,无需针对不同数据库进行语法调整,大大提高了系统的兼容性和可移植性。

sql

// 构建带参数的SQL语句
$sql = " SELECT 库存ID, 库存编码, RTRIM(库存名称) AS 库存名称,RTRIM(库存类别) AS 库存类别,RTRIM(库存款式) AS 库存款式,RTRIM(库存规格) AS 库存规格,ISNULL(门店成本, 库存成本) AS 库存成本, 期初数量, 增加数量, 减少数量, (期初数量 + 增加数量 - 减少数量) AS 总数量 FROM (SELECT 库存主表.库存ID AS 库存ID, 库存主表.库存编码 AS 库存编码, 库存主表.库存名称 AS 库存名称, 库存主表.库存类别 AS 库存类别, 库存主表.库存款式 AS 库存款式, 库存主表.库存规格 AS 库存规格, 库存主表.库存成本 AS 库存成本, (SELECT 库存成本 FROM 库存门店成本 WHERE 库存门店成本.库存ID = 库存主表.库存ID AND 库存门店成本.分店 = @仓库) AS 门店成本, SUM(CASE WHEN (库存凭证.出入库 = 1 OR 库存凭证.出入库 = -1) AND 库存凭证.生效日期 < @开始日期 THEN 库存凭证明细.数量 * 库存凭证.增减标识 ELSE 0 END) AS 期初数量, SUM(CASE WHEN 库存凭证.出入库 = 1 AND 库存凭证.生效日期 >= @开始日期 AND 库存凭证.生效日期 <= @结束日期 THEN 库存凭证明细.数量 * 库存凭证.增减标识 ELSE 0 END) AS 增加数量, SUM(CASE WHEN 库存凭证.出入库 = -1 AND 库存凭证.生效日期 >= @开始日期 AND 库存凭证.生效日期 <= @结束日期 THEN 库存凭证明细.数量 * 库存凭证.增减标识 * -1 ELSE 0 END) AS 减少数量 FROM 库存凭证, 库存凭证明细, 库存主表 WHERE 库存凭证.凭证ID = 库存凭证明细.主表ID AND 库存凭证明细.库存ID = 库存主表.库存ID AND 库存凭证.状态 = @状态 AND 库存凭证.仓库 LIKE @仓库 " . // 添加商品ID筛选条件(如果提供了商品ID)(!empty($商品ID)? " AND 库存主表.库存ID = @商品ID " : "") . "GROUP BY 库存主表.库存ID, 库存主表.库存编码, 库存主表.库存名称, 库存主表.库存类别, 库存主表.库存款式, 库存主表.库存规格, 库存主表.库存成本) AS 库存数据 ORDER BY 库存编码',N'@状态 int, @开始日期 datetime, @结束日期 datetime, @仓库 nvarchar(4)" . (!empty($商品ID)? ", @商品ID int" : "") . "',@状态 = " . $状态 . ", @开始日期 = '" . $开始日期 . "', @结束日期 = '" . $结束日期 . "', @仓库 = N'" . $分店 . "'" . // 商品ID参数(如果提供)(!empty($商品ID)? ", @商品ID = " . $商品ID : "");

  1. 简化维护难度,提高代码可读性:通用 SQL 以更直观的方式展示数据查询逻辑,对于不熟悉存储过程复杂语法和结构的开发人员来说,更容易理解和维护。在上述转换后的代码中,SQL 语句的结构和逻辑一目了然,直接从多张表中获取数据并进行计算和筛选,开发人员可以快速定位和修改相关逻辑,减少维护成本。
  2. 便于代码审查和优化:通用 SQL 便于进行代码审查,因为其语法和结构相对统一。审查人员可以更清晰地分析查询性能,发现潜在的问题,如是否存在冗余连接、不合理的条件判断等。通过优化通用 SQL,可以提高查询效率,进而提升整个进销存系统的性能。

sql

// 基础查询SQL
$sql = "SELECT 库存ID, 库存编码, RTRIM(库存名称) AS 库存名称,RTRIM(库存类别) AS 库存类别,RTRIM(库存款式) AS 库存款式,RTRIM(库存规格) AS 库存规格,ISNULL(门店成本, 库存成本) AS 库存成本, 期初数量, 增加数量, 减少数量, (期初数量 + 增加数量 - 减少数量) AS 总数量 FROM (SELECT 库存主表.库存ID AS 库存ID, 库存主表.库存编码 AS 库存编码, 库存主表.库存名称 AS 库存名称, 库存主表.库存类别 AS 库存类别, 库存主表.库存款式 AS 库存款式, 库存主表.库存规格 AS 库存规格, 库存主表.库存成本 AS 库存成本, (SELECT 库存成本 FROM 库存门店成本 WHERE 库存门店成本.库存ID = 库存主表.库存ID AND 库存门店成本.分店 = '" . $分店 . "') AS 门店成本, SUM(CASE WHEN (库存凭证.出入库 = 1 OR 库存凭证.出入库 = -1) AND 库存凭证.生效日期 < '" . $开始日期 . "' THEN 库存凭证明细.数量 * 库存凭证.增减标识 ELSE 0 END) AS 期初数量, SUM(CASE WHEN 库存凭证.出入库 = 1 AND 库存凭证.生效日期 >= '" . $开始日期 . "' AND 库存凭证.生效日期 <= '" . $结束日期 . "' THEN 库存凭证明细.数量 * 库存凭证.增减标识 ELSE 0 END) AS 增加数量, SUM(CASE WHEN 库存凭证.出入库 = -1 AND 库存凭证.生效日期 >= '" . $开始日期 . "' AND 库存凭证.生效日期 <= '" . $结束日期 . "' THEN 库存凭证明细.数量 * 库存凭证.增减标识 * -1 ELSE 0 END) AS 减少数量 FROM 库存凭证, 库存凭证明细, 库存主表 WHERE 库存凭证.凭证ID = 库存凭证明细.主表ID AND 库存凭证明细.库存ID = 库存主表.库存ID AND 库存凭证.状态 = " . $状态 . " AND 库存凭证.仓库 LIKE '" . $分店 . "' ";// 添加商品ID筛选条件(如果提供了商品ID)
if (!empty($商品ID)) {$sql .= " AND 库存主表.库存ID = '" .$商品ID . "' ";
}// 完成SQL语句
$sql .= " GROUP BY 库存主表.库存ID, 库存主表.库存编码, 库存主表.库存名称, 库存主表.库存类别, 库存主表.库存款式, 库存主表.库存规格, 库存主表.库存成本) AS 库存数据 ORDER BY 库存编码";

结论

在进销存系统中,将存储过程转换为通用 SQL 具有显著的好处,不仅可以提升系统的兼容性,降低数据库迁移成本,还能简化代码维护难度,提高查询性能。开发人员在实际项目中应根据具体需求和场景,权衡存储过程和通用 SQL 的使用,以实现更高效、稳定的进销存系统。

阿雪技术观

在科技发展浪潮中,我们不妨积极投身技术共享。不满足于做受益者,更要主动担当贡献者。无论是分享代码、撰写技术博客,还是参与开源项目维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地,我们携手在此探索硅基生命,为科技进步添砖加瓦。

Hey folks, in this wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets, hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome place where we all come together. We're gonna team up and explore the whole silicon - based life thing, and in the process, we'll be fueling the growth of technology.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94245.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis面试精讲 Day 28:Redis云原生部署与Kubernetes集成

【Redis面试精讲 Day 28】Redis云原生部署与Kubernetes集成 在当今微服务与容器化浪潮中&#xff0c;Redis作为高性能缓存和消息中间件&#xff0c;已从单机部署逐步演进为云原生环境下的核心组件。Day 28 聚焦“Redis云原生部署与Kubernetes集成”&#xff0c;深入解析如何在…

leetcode刷题记录03——top100题里的6道简单+1道中等题

leetcode刷题记录03——top100题里的6道简单1道中等题上一篇博客&#xff1a; leetcode刷题记录01——top100题里的7道简单题 leetcode刷题记录02——top100题里的7道简单题 有效的括号 看懂需要用栈了&#xff0c;但是不知道怎么去写&#xff0c;看了题解mark下正确答案。 cla…

求单位球内满足边界条件 u = z³ 的调和函数

问题 6&#xff1a;在区域 {x2y2z2≤1}\{x^{2}y^{2}z^{2}\leq 1\}{x2y2z2≤1} 内找到一个调和函数 uuu&#xff0c;使得在边界 x2y2z21x^{2}y^{2}z^{2}1x2y2z21 上&#xff0c;uuu 等于 gz3gz^{3}gz3。 提示&#xff1a;根据第8.1节&#xff0c;解必须是一个三次调和多项式&…

AAA 服务器与 RADIUS 协议笔记

一、AAA 服务器概述1. 核心定义AAA 是认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;和计费&#xff08;Accounting&#xff09; 的简称&#xff0c;是网络安全领域中实现访问控制的核心安全管理机制&#xff0c;通过整合三种服务确保…

Vue3源码reactivity响应式篇之数组代理的方法

概览 vue3中对于普通的代理包含对象和数组两类&#xff0c;对于数组的方法是重写了许多方法&#xff0c;具体实现参见packages\reactivity\src\arrayInstrumentations.ts arrayInstrumentations实际上就是一个对象&#xff0c;对象的属性就是数组的方法&#xff0c;属性值就是重…

如何玩转K8s:从入门到实战

一、K8S介绍及部署 1 应用的部署方式演变 部署应用程序的方式上&#xff0c;主要经历了三个阶段&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用…

综合测验:配置主dns,dhcp,虚拟主机,nfs文件共享等

综合实验(所有设备关闭防火墙和selinux)在appsrv上部署主dns&#xff0c;为example.com提供域名解析 安装bind bind-chroot rootappsrv ~]# yum install bind bind-chroot -y编辑主配置文件&#xff0c;全局配置文件&#xff0c;正向解析文件 [rootappsrv ~]# vim /etc/named.c…

MySQL数据库管理与索引优化全攻略

一、表管理1.建库语法&#xff1a;create database if not exists 数据库名;命名规则&#xff1a;仅可使用数字、字母、下划线、不能纯数字&#xff1b;区分字母大小写&#xff1b;具有唯一性&#xff1b;不可使用MySQL命令或特殊字符。相关命令&#xff1a;show databases; …

基于大模型构建 Java 混淆的方式方法(从入门到精通 · 含开源实践)

1. 目标与威胁模型:你到底想防什么? 把“混淆”当作成本叠加器:让逆向者付出更多时间与技能,而不影响用户体验与可维护性。可用 Collberg 等提出的四指标来权衡:有效性/韧性/隐蔽性/成本(potency/resilience/stealth/cost)。近年的研究也在重审这些评估方法,建议结合可…

RabbitMQ面试精讲 Day 28:Docker与Kubernetes部署实践

【RabbitMQ面试精讲 Day 28】Docker与Kubernetes部署实践 在微服务架构日益普及的今天&#xff0c;消息中间件RabbitMQ已成为解耦系统、异步通信的核心组件。随着云原生技术的成熟&#xff0c;如何在Docker与Kubernetes&#xff08;K8s&#xff09;环境中高效、高可用地部署Ra…

神经网络和深度学习介绍

目录 1.深度学习的介绍 2.神经网络的构造 ①神经元结构 ②神经网络组成 ③权重核心性 3.神经网络的本质 4.感知器 单层感知器的局限性&#xff1a; 5.多层感知器 多层感知器的优势&#xff1a; 6.偏置 7.神经网络的设计 8.损失函数 常用的损失函数&#xff1a; 9…

云原生俱乐部-k8s知识点归纳(8)

这一部分主要讲一讲CRD客户资源定义、Gateway API、Priority Class优先类、HPA自动扩缩这四部分内容。还剩下Argo CD的内容了整个k8s&#xff0c;至于operator的话单独有一本书&#xff0c;都是实战内容。CRD客户资源定义先来讲一讲这节内容的几个核心术语&#xff0c;Custom R…

【机器学习】7.随机森林之数学原理

随机森林&#xff08;Random Forest&#xff09;的数学原理核心是“决策树基学习器 Bootstrap抽样 特征随机选择” 的集成框架&#xff0c;通过降低单棵决策树的方差、提升模型泛化能力来工作。以下分步骤解析其数学推导与核心逻辑&#xff1a; 一、 基学习器&#xff1a;决策…

大模型微调面试题全解析:从概念到实战

大模型微调面试题全解析&#xff1a;从概念到实战 微调基础概念 本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型开发 学习视频/籽料/面试题 都在这>>Github<< >>gitee<< &#xff08;一&#xff09;什么是微调 微调&#xf…

Linux: network: arp: arp_accept

文章目录 接收 linux 代码 arp协议的处理 接收 arp_accept - BOOLEAN Define behavior for gratuitous ARP frames who’s IP is not already present in the ARP table: 0 - don’t create new entries in the ARP table 1 - create new entries in the ARP table Both repli…

SpringBoot 整合 Langchain4j RAG 技术深度使用解析

目录 一、前言 二、Langchain4j RAG介绍 2.1 什么是LangChain4j 2.2 LangChain4j RAG技术介绍 2.2.1 RAG技术原理 2.2.2 LangChain4j中的RAG实现 2.2.3 LangChain4j RAG技术优势 2.2.4 LangChain4j RAG技术应用场景 三、LangChain4j RAG 技术深度使用 3.1 文档加载与解…

百度深度学习面试:batch_size的选择问题

题目在深度学习中&#xff0c;为什么batch_size设置为1不好&#xff1f;为什么batch_size设为整个数据集的大小也不好&#xff1f;&#xff08;假设服务器显存足够&#xff09;解答这是一个非常核心的深度学习超参数问题。即使显存足够&#xff0c;选择极端的 batch_size 也通常…

AWS Fargate 完全指南:在无服务器容器中释放应用潜能

容器化技术带来了应用交付的革命,但管理运行容器的底层服务器集群却带来了新的复杂性。如何在不牺牲容器灵活性的前提下,摆脱服务器的运维重负? AWS Fargate 应运而生。它是一款为容器打造的无服务器计算引擎,让您能够专注于构建应用程序,而无需管理服务器。本文将带您深…

WSL Ubuntu数据迁移

将 WSL 中的 Ubuntu 迁移到其他磁盘可有效释放 C 盘空间并优化系统性能。以下是详细步骤及注意事项&#xff1a;&#x1f4cd; ​​迁移步骤​​​​备份 WSL 数据&#xff08;防止意外丢失&#xff09;​​以管理员身份打开 PowerShell 或命令提示符。导出 Ubuntu 实例为压缩包…

基于STM32的病房监测系统/环境监测系统/人体健康监测系统

基于STM32的病房监测系统/环境监测系统/人体健康监测系统 持续更新&#xff0c;欢迎关注!!! 基于STM32的病房监测系统/环境监测系统/人体健康监测系统 随着科技的进步与人们健康意识的提升&#xff0c;环境与人体健康监测的需求日益增长。在医疗、居住和工作环境中&#xff0c…