SQL Server中如何创建随源表自动更新的多表合并新表?
解决方案:用视图替代静态表实现实时数据同步
你遇到的问题本质是:SELECT INTO 创建的是静态物理表,数据仅为执行语句那一刻的快照,源表后续的变更不会自动同步到这个新表。另外,SQL Server 本身不支持标准的 CREATE TABLE AS SELECT(CTAS)语法,这也是你用该语句报错的原因。
要实现「能实时显示源表最新数据的表结构」,不需要创建物理表,推荐以下两种方案:
1. 创建普通视图(简单灵活,推荐)
视图本质是存储的查询逻辑,每次查询视图时都会重新执行底层的 SELECT 语句,直接从源表获取最新数据,完全满足你实时查看更新结果的需求。
把你的查询改成视图语法即可:
CREATE VIEW W_Prod_Sync AS SELECT ST.StockID, SH.ShopID, SB.Barcode, SS.SupplierCode, ST.Description, ST.FamilyClassID, FC.Description AS FC_Description, ST.TaxRate, ST.RRP, ST.BusinessPrice, ST.SalePrice, ST.SaleBusinessDateFrom, ST.SaleBusinessDateTo, ST.Inactive, SH.OnHandNonInt, ST.LastModifiedDT FROM [dbo].[Stock] AS ST INNER JOIN [dbo].[StockBarcode] AS SB ON ST.StockID = SB.StockID INNER JOIN [dbo].[StockOnHand] AS SH ON ST.STOCKID = SH.STOCKID INNER JOIN [dbo].[FamilyClass] AS FC ON ST.FamilyClassID = FC.FamilyClassID INNER JOIN [dbo].[StockSupplierCode] AS SS ON ST.StockID = SS.StockID
之后查询这个视图就和查询普通表一样,需要排序的话在查询时添加 ORDER BY:
SELECT * FROM W_Prod_Sync ORDER BY Inactive ASC, LastModifiedDT DESC;
2. 创建索引视图(适合频繁查询、需要高性能的场景)
如果这个「表」需要被频繁查询,不想每次都执行复杂的 JOIN 逻辑,可以创建索引视图。它会把视图的数据物理化存储,SQL Server 会自动维护数据同步——源表更新时,索引视图的数据也会跟着更新。
注意索引视图有一些限制:需要绑定架构(SCHEMABINDING),所有引用的表必须用两部分命名(dbo.Table),必须包含 COUNT_BIG(*) 用于架构绑定,且不能直接用 ORDER BY(除非结合 TOP 语法)。
示例语法:
CREATE VIEW W_Prod_Sync_Indexed WITH SCHEMABINDING AS SELECT ST.StockID, SH.ShopID, SB.Barcode, SS.SupplierCode, ST.Description, ST.FamilyClassID, FC.Description AS FC_Description, ST.TaxRate, ST.RRP, ST.BusinessPrice, ST.SalePrice, ST.SaleBusinessDateFrom, ST.SaleBusinessDateTo, ST.Inactive, SH.OnHandNonInt, ST.LastModifiedDT, COUNT_BIG(*) AS RowCount -- 架构绑定视图必须包含COUNT_BIG FROM [dbo].[Stock] AS ST INNER JOIN [dbo].[StockBarcode] AS SB ON ST.StockID = SB.StockID INNER JOIN [dbo].[StockOnHand] AS SH ON ST.STOCKID = SH.STOCKID INNER JOIN [dbo].[FamilyClass] AS FC ON ST.FamilyClassID = FC.FamilyClassID INNER JOIN [dbo].[StockSupplierCode] AS SS ON ST.StockID = SS.StockID GROUP BY ST.StockID, SH.ShopID, SB.Barcode, SS.SupplierCode, ST.Description, ST.FamilyClassID, FC.Description, ST.TaxRate, ST.RRP, ST.BusinessPrice, ST.SalePrice, ST.SaleBusinessDateFrom, ST.SaleBusinessDateTo, ST.Inactive, SH.OnHandNonInt, ST.LastModifiedDT GO -- 必须先创建唯一聚集索引,才能使用索引视图 CREATE UNIQUE CLUSTERED INDEX IX_W_Prod_Sync_Indexed_StockID_ShopID ON W_Prod_Sync_Indexed (StockID, ShopID);
方案对比
- 普通视图无存储成本,每次查询实时计算,适合源表更新频繁、查询频率不高的场景。
- 索引视图有存储成本,但查询速度更快,适合查询频繁、源表更新频率适中的场景。
- 若非要用物理表同步,也可以给源表加
INSERT/UPDATE/DELETE触发器,同步更新目标表,但这种方式维护成本高,容易出现数据不一致,不推荐除非有特殊需求。
内容的提问来源于stack exchange,提问作者john haralambides
相关产品推荐
相关产品推荐

