SQLServer将视图或表的记录不重复地插入到另一个表

SQL Server视图或表的记录不重复地插入到另一个表中的方法与思路是本文我们要介绍的,接下来就让我们来一起了解一下这部分内容吧。

创新互联主要业务有网站营销策划、成都网站制作、做网站、外贸营销网站建设、微信公众号开发、微信平台小程序开发H5场景定制、程序开发等业务。一次合作终身朋友,是我们奉行的宗旨;我们不仅仅把客户当客户,还把客户视为我们的合作伙伴,在开展业务的过程中,公司还积累了丰富的行业经验、成都全网营销推广资源和合作伙伴关系资源,并逐渐建立起规范的客户服务和保障体系。 

最近在做个自动更新数据的小程序,每天有几个表的txt记录集要更新到数据库,并且txt记录集中的数据列并不全用,只使用一部分。

在做完更新程序后,发现还少了一个功能:自动提示重要数据的功能,在编写时发现需要一个表记录是否关联表记录是否已提示,这牵涉一个问题,插入提示记录的表数据会重复导致重复提示,没有必要的短信会发送,当然可以通过以下步骤判断记录是否是重复:

  1. 将关键字段生成唯一索引
  2. 从视图或表中读取记录插入到提示表

这样逻辑比较简单,但是效率有点低了,要与sqlserve多次通讯,能不能在数据库端就完成这些操作呢,反正取记录、更新到表都是固定的,在网上找了一下倒是有不少,但没有完整的实现,经过一上午的努力,终于解决了问题,所以作文以记之。

由于工作关系,不便使用原数据,生成了两个模拟的表,结构如下:

 
 
 
 
  1. CREATE TABLE [dbo].[t1](
  2.     [c1] [nchar](10) NOT NULL,
  3.     [c2] [nchar](20) NOT NULL
  4. ) ON [PRIMARY]
  5. GO
  6. CREATE TABLE [dbo].[t2](
  7.     [Id] [int] IDENTITY(1,1) NOT NULL,
  8.     [c1] [nchar](10) NOT NULL,
  9.     [c2] [nchar](20) NOT NULL,
  10.     [IsHandled] [bit] NOT NULL
  11. ) ON [PRIMARY]
  12. GO
  13. ALTER TABLE [dbo].[t2] ADD  CONSTRAINT [DF_t2_IsHandled]  DEFAULT ((0)) FOR [IsHandled]
  14. GO
  15. --生成数据
  16. INSERT INTO [test].[dbo].[t1]([c1],[c2]) VALUES     ('a1','a2')
  17. INSERT INTO [test].[dbo].[t1]([c1],[c3]) VALUES ('a1','a3')
  18. INSERT INTO [test].[dbo].[t1]([c1],[c4]) VALUES ('a1','a4')
  19. INSERT INTO [test].[dbo].[t1]([c1],[c5]) VALUES ('a1','a5')
  20. INSERT INTO [test].[dbo].[t1]([c1],[c6]) VALUES ('a1','a6')
  21. INSERT INTO [test].[dbo].[t1]([c1],[c7]) VALUES ('a1','a7')
  22. INSERT INTO [test].[dbo].[t1]([c1],[c8]) VALUES ('a1','a8')
  23. INSERT INTO [test].[dbo].[t1]([c1],[c9]) VALUES ('a1','a9')
  24. INSERT INTO [test].[dbo].[t1]([c1],[c10]) VALUES    ('a1','a2')
  25. INSERT INTO [test].[dbo].[t1]([c1],[c11]) VALUES    ('a1','a11')

思路:阻止重复数据插入不外两个办法,一是利用唯一索引,二是利用事务,插入后判断同样的记录是否有两条,是的话,回滚事务。具体实现如下:

  1. 读取T1的数据,
  2. 用游标读取每一条记录,并插入T2

方法一、利用唯一索引

方法二、利用事务,在这里建立一个存储过程方便调用

 
 
 
 
  1. Create procedure [dbo].[insert_t2]
  2. @c1 varchar(10), --定义一个输入参数,就是那个是不是重复的值
  3. @c2 varchar(20)    --把每一列弄成变量存入,不知你的表有几字段,这里我就以两个字段为例
  4. as  
  5.     declare @sum int
  6.  begin tran
  7.     insert into t2 (c1,c2) values (@c1,@c2)
  8.  select @sum=count(*) from t2 where (c1=@c1) and (c2=@c2)
  9.     if(@sum>1)
  10.     begin
  11.   raiserror('该记录已经存在',16,8)
  12.   rollback tran  --滚回事务
  13.     end
  14.     else
  15.         commit tran  --提交事务

下面是从T1取数据存入游标的存储过程

 
 
 
 
  1. Create procedure [dbo].[GetT1]
  2.       @MyCursor Cursor Varying Output
  3.       --With Encryption
  4.       As 
  5.              Set @MyCursor = Cursor
  6.              For
  7.                     Select C1,C2 From T1
  8.       Open @MyCursor

将数据插入T2的存储过程

 
 
 
 
  1. Create Procedure InsertIntoT2
  2.       As
  3.       Declare @c1 varchar(20)
  4.       Declare @c2 nvarchar(20)
  5.       Declare @T1DataCursor Cursor 
  6.       Exec GetT1 @T1DataCursor out      
  7.       Fetch Next From @T1DataCursor
  8.       InTo @c1,@c2
  9.       While(@@Fetch_Status = 0)
  10.       Begin
  11.             exec [test].[dbo].[insert_t2] @c1,
  12.             
  13.              Fetch Next From @T1DataCursor
  14.              InTo @c1,@c2
  15.       End
  16.       Close @T1DataCursor
  17.       Deallocate @T1DataCursor
  18.       Go

调用方法

 
 
 
 
  1. DECLARE @RC int
  2. -- TODO: 在此处设置参数值。
  3. EXECUTE @RC = [test].[dbo].InsertIntoT2
  4. GO

结果:

 
 
 
 
  1. SELECT TOP 1000 [Id]
  2.       ,[c1]
  3.       ,[c2]
  4.       ,[IsHandled]
  5.   FROM [test].[dbo].[t2]

可以看到t2只有9行记录。

关于SQL Server数据库中将视图或表中的记录不重复地插入到另一个表中的方法就介绍到这里了,希望本次的介绍能够对您有所帮助。

本文标题:SQLServer将视图或表的记录不重复地插入到另一个表
URL地址:http://www.csdahua.cn/qtweb/news7/233007.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网