|
此文章内容参考:http://database.iyunv.com/art/201108/283375.htm
本文结合自己实际工作经验,可能不是最好的处理办法,但也从某种程度上解决了一部分问题,如存在问题,请指教。
一、引言
首先
问题1: 在开发报表时,直接从业务数据表中提取数据的效率特别低?
原因1:大量计算工作放在程序中处理,没有充分利用数据库处理数据的优势。
解决办法1:采用视图方式组织基础业务数据,再通过程序查询。
进一步:
问题2:视图是从数据库业务表中直接获取数据,没有从根本上解决报表慢的问题?
原因2:数据的组织,查询工作仍然在打开报表的时候进行。
解决办法2:将视图中获取的数据定期更新到与视图结构完全相同的表中,报表查询时,直接从静态表中获取数据.
二、正文
找到问题的解决办法,接下来我们确定一个目标:
目标:将视图(V_SZLQ_PROJECT_PROCESS)数据同步到表(TV_SZLQ_PROJECT_PROCESS) 中
先了解一下视图与表的结构:
视图:
表结构:
数据同步思路:利用事务,在这里建立一个存储过程方便调用
--存储过程:插入工程进度
--创建人:morethree
--创建日期:2014-03-29 11:50
Create procedure [DBO].[P_SZLQ_PROJECT_PROCESS_INSERT]
@ID int,
@PROJECT int,
@YEARR int,
@MONTHH int,
@PROCESSMONTH datetime,
@DIVIDE int,
@INVENTORY int,
@PRICE decimal(18, 5),
@PROCESSAMOUNT decimal(18, 6),
@ISCHANGE bit
as
declare @sum int
begin tran
insert into TV_SZLQ_PROJECT_PROCESS(ID,PROJECT,YEARR,MONTHH,PROCESSMONTH,DIVIDE,INVENTORY,PRICE,PROCESSAMOUNT,ISCHANGE)
values (@ID,@PROJECT,@YEARR,@MONTHH,@PROCESSMONTH,@DIVIDE,@INVENTORY,@PRICE,@PROCESSAMOUNT,@ISCHANGE)
select @sum = count(*) from TV_SZLQ_PROJECT_PROCESS where (ID=@ID)
if(@sum>1)
begin
raiserror('记录已经存在',16,8)
rollback tran--回滚事物
end
else
commit tran--提交事务
--存储过程:返回工程进度游标的存储过程
--创建人:morethree
--创建日期:2014-03-29 11:50
Create procedure [DBO].[P_SZLQ_PROJECT_PROCESS_GET]
@VProcessCursor Cursor Varying Output
--With Encryption
As
Set @VProcessCursor = Cursor
For
Select ID,PROJECT,YEARR,MONTHH,PROCESSMONTH,DIVIDE,INVENTORY,PRICE,PROCESSAMOUNT,ISCHANGE from V_SZLQ_PROJECT_PROCESS
Open @VProcessCursor
--存储过程:执行插入工程进度
--创建人:morethree
--创建日期:2014-03-29 12:10
Create procedure [DBO].[P_SZLQ_PROJECT_PROCESS_INSERT_EXCUTE]
As
Declare @ID int
Declare @PROJECT int
Declare @YEARR int
Declare @MONTHH int
Declare @PROCESSMONTH datetime
Declare @DIVIDE int
Declare @INVENTORY int
Declare @PRICE decimal(18, 5)
Declare @PROCESSAMOUNT decimal(18, 6)
Declare @ISCHANGE bit
Declare @VProcessCursor Cursor
Exec P_SZLQ_PROJECT_PROCESS_GET @VProcessCursor out
Fetch Next From @VProcessCursor
InTo @ID,@PROJECT,@YEARR,@MONTHH,@PROCESSMONTH,@DIVIDE,@INVENTORY,@PRICE,@PROCESSAMOUNT,@ISCHANGE
While(@@Fetch_Status = 0)
Begin
exec [dbo].[P_SZLQ_PROJECT_PROCESS_INSERT] @ID,@PROJECT,@YEARR,@MONTHH,@PROCESSMONTH,@DIVIDE,@INVENTORY,@PRICE,@PROCESSAMOUNT,@ISCHANGE
Fetch Next From @VProcessCursor
InTo @ID,@PROJECT,@YEARR,@MONTHH,@PROCESSMONTH,@DIVIDE,@INVENTORY,@PRICE,@PROCESSAMOUNT,@ISCHANGE
End
Close @VProcessCursor
Deallocate @VProcessCursor
Go
--调用存储过程
DECLARE @RC int
-- TODO: 在此处设置参数值。
EXECUTE @RC = [dbo].[P_SZLQ_PROJECT_PROCESS_INSERT_EXCUTE]
GO
关于SQL Server数据库中将视图或表中的记录不重复地插入到另一个表中的方法就介绍到这里了,希望本次的介绍能够对您有所帮助。
|
|