自动从视图中插入数据

时间:2017-06-12 07:42:09

标签: sql sql-server-2008

我的表格包含不同类型产品的当前库存,位置和成本。

我打算创建一个视图,在每天结束时将这些数据合并,以便每天保存我的库存历史,如下所示:

opening stock (of yesterday) ---  Sales ---- Closing Stock (today)

但我不知道实现此目的的最佳方法是什么,以及避免数据重复。我正在使用SQL Server,但我对它不是很熟悉。

1 个答案:

答案 0 :(得分:0)

我可以通过以下步骤进行说明,我假设您的表是使用主键定义的,以消除重复记录更新。

CREATE TABLE TransactionHistory(
                ProductNo varchar(10) not null 
                ,Product_name varchar(100) not null
                ,TransactionDate Date
                ,SalesValue float
 CONSTRAINT [Pk_product] PRIMARY KEY CLUSTERED 
(
    productno asc
    ,product_name asc
    ,transactionDate asc
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

- 立即创建视图以将数据插入表格

Create View Vw_TransactionHistory 
as

select 
       ProductNo
      ,Product_name
      ,TransactionDate
      ,SalesValue

 from salesTable

 where transactiondate = getdate ()-15


GO

所以,查看最近15天的数据或者您可以将其更改为getdate()或getdate() - 1

- 第3步现在,创建一个更新记录或插入新记录的合并程序

CREATE PROCEDURE usp_transactionHistory
AS
BEGIN
    MERGE dbo.TransactionsHistory AS TARGET
    USING Vw_TransactionHistory AS SOURCE
        ON (
                TARGET.ProductNo = SOURCE.ProductNo
                AND TARGET.Product_name = source.Product_name
                AND TARGET.TransactionDate = SOURCE.TransactionDate
                AND TARGET.SalesValue = SOURCE.SalesValue
                )
    WHEN MATCHED
        THEN
            UPDATE
            SET TARGET.ProductNo = SOURCE.ProductNo
                ,TARGET.Product_name = source.Product_name
                ,TARGET.TransactionDate = SOURCE.TransactionDate
                ,TARGET.SalesValue = SOURCE.SalesValue
    WHEN NOT MATCHED BY TARGET
        THEN
            INSERT (
                ProductNo
                ,Product_name
                ,TransactionDate
                ,SalesValue
                )
            VALUES (
                SOURCE.ProductNo
                ,SOURCE.Product_name
                ,SOURCE.TransactionDate
                ,SOURCE.SalesValue
                );
END
GO