如何解决如何保持 tblPurchase 和 tblProductStock 表不下降 我需要保持表和值永久不变
如何在不删除 tblPurchase 和 tblProductStock 的情况下更改此存储过程。 当我在添加新记录表后使用此存储过程运行我的程序时,数据将被删除。我想保护所有表和数据。请帮我解决这个问题。
https://stackoverflow.com/a/65774309/13338320
解决方法
索引视图
基于 Indexed Views 的全新解决方案是可能的。
索引视图是一个视图,上面有一个聚集索引,数据实际上存储在磁盘上。
据我所知,您正在尝试保留存储在 tblProduct
中的每个产品项目的购买总额。我假设 ItemCode
是 tblProduct 的 PK 并且 ItemName
也在那里定义(我们不能在索引视图中使用 MAX
)。所以我们可以这样定义一个视图:
CREATE VIEW dbo.vwTotalPurchases
WITH SCHEMABINDING -- must be schema bound,we cannot change underlying columns after creation
AS
SELECT
ItemCode,SUM(Quantity) QuantityPurchased,COUNT_BIG(*) CountPurchases -- if we group,must have count also,so that rows can be maintained
FROM dbo.tblPurchase -- must use two-part names
GROUP BY itemCode;
GO
然后我们可以在其上创建一个聚集索引以将其保存在磁盘上。每当对基表进行更新时,SQL Server 都会维护索引。如果分组中没有更多行(由计数为 0 来标识),则删除该行:
CREATE UNIQUE CLUSTERED INDEX PK_vwTotalPurchases ON dbo.vwTotalPurchases (ItemCode);
GO
现在如果我们想查询它,我们可以将这个视图左连接到 tblProducts
(左连接,因为可能没有购买):
SELECT
p.ItemCode,p.ItemName,ISNULL(tp.QuantityPurchased,0) QuantityPurchased,ISNULL(tp.CountPurchases,0) CountPurchases
FROM tblProducts p
LEFT JOIN vwTotalPurchases tp WITH (NOEXPAND) ON tp.ItemCode = p.ItemCode;
我们也可以将其定义为视图(不是索引视图,而是标准视图),以便该定义可在任何地方使用。
关于 NOEXPAND
的注意事项:
如果您使用的不是 SQL Server Enterprise 或 Developer Edition,则必须使用提示 WITH (NOEXPAND)
来强制它使用索引,否则它将查询基础 tblPurchase
。即使在这些版本中,最好使用 NOEXPAND
。
请参阅 Paul White 撰写的 this article。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。