數據庫優化提速(一)之進銷存庫存管理—仙盟創夢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
英文地址,請注明出處:http://en.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 = z3 的調和函數

問題 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…