设为首页 收藏本站
查看: 1325|回复: 0

[经验分享] SQL Server将视图或表的记录不重复地插入到另一个表

[复制链接]

尚未签到

发表于 2016-11-8 08:15:19 | 显示全部楼层 |阅读模式
  此文章内容参考:http://database.iyunv.com/art/201108/283375.htm
  本文结合自己实际工作经验,可能不是最好的处理办法,但也从某种程度上解决了一部分问题,如存在问题,请指教。
  一、引言
  首先
  问题1: 在开发报表时,直接从业务数据表中提取数据的效率特别低?
  原因1:大量计算工作放在程序中处理,没有充分利用数据库处理数据的优势。
  解决办法1:采用视图方式组织基础业务数据,再通过程序查询。
  进一步:
  问题2:视图是从数据库业务表中直接获取数据,没有从根本上解决报表慢的问题?
  原因2:数据的组织,查询工作仍然在打开报表的时候进行。
  解决办法2:将视图中获取的数据定期更新到与视图结构完全相同的表中,报表查询时,直接从静态表中获取数据.
  二、正文
  找到问题的解决办法,接下来我们确定一个目标:
  目标:将视图(V_SZLQ_PROJECT_PROCESS)数据同步到表(TV_SZLQ_PROJECT_PROCESS) 中
  先了解一下视图与表的结构:
  视图:
DSC0000.jpg

  表结构:
DSC0001.jpg

  数据同步思路:利用事务,在这里建立一个存储过程方便调用
  --存储过程:插入工程进度
--创建人: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数据库中将视图或表中的记录不重复地插入到另一个表中的方法就介绍到这里了,希望本次的介绍能够对您有所帮助。
  
  
  

  
  
  


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-297121-1-1.html 上篇帖子: Sql Server每日一练-ASP访问数据库的几种方式 下篇帖子: SQL Server 数据挖掘系列(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表