微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何保持 tblPurchase 和 tblProductStock 表不下降 我需要保持表和值永久不变

如何解决如何保持 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 举报,一经查实,本站将立刻删除。