关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »SQL Server将视图或表的记录不重复地插入到另一个表

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

    2011-08-15 13:20:00 出处:ITJS
    分享

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

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

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

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

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

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

    CREATE TABLE [dbo].[t1](      [c1] [nchar](10) NOT NULL,      [c2] [nchar](20) NOT NULL  ) ON [PRIMARY]   GO  CREATE TABLE [dbo].[t2](      [Id] [int] IDENTITY(1,1) NOT NULL,      [c1] [nchar](10) NOT NULL,      [c2] [nchar](20) NOT NULL,      [IsHandled] [bit] NOT NULL  ) ON [PRIMARY]   GO   ALTER TABLE [dbo].[t2] ADD  CONSTRAINT [DF_t2_IsHandled]  DEFAULT ((0)) FOR [IsHandled]  GO  --生成数据  INSERT INTO [test].[dbo].[t1]([c1],[c2]) VALUES     ('a1','a2')  INSERT INTO [test].[dbo].[t1]([c1],[c3]) VALUES ('a1','a3')  INSERT INTO [test].[dbo].[t1]([c1],[c4]) VALUES ('a1','a4')  INSERT INTO [test].[dbo].[t1]([c1],[c5]) VALUES ('a1','a5')  INSERT INTO [test].[dbo].[t1]([c1],[c6]) VALUES ('a1','a6')  INSERT INTO [test].[dbo].[t1]([c1],[c7]) VALUES ('a1','a7')  INSERT INTO [test].[dbo].[t1]([c1],[c8]) VALUES ('a1','a8')  INSERT INTO [test].[dbo].[t1]([c1],[c9]) VALUES ('a1','a9')  INSERT INTO [test].[dbo].[t1]([c1],[c10]) VALUES    ('a1','a2')  INSERT INTO [test].[dbo].[t1]([c1],[c11]) VALUES    ('a1','a11') 

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

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

    方法一、利用唯一索引

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

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

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

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

    Create procedure [dbo].[GetT1]        @MyCursor Cursor Varying Output        --With Encryption        As                Set @MyCursor = Cursor               For                      Select C1,C2 From T1        Open @MyCursor 

    将数据插入T2的存储过程

    Create Procedure InsertIntoT2        As         Declare @c1 varchar(20)        Declare @c2 nvarchar(20)        Declare @T1DataCursor Cursor         Exec GetT1 @T1DataCursor out              Fetch Next From @T1DataCursor        InTo @c1,@c2        While(@@Fetch_Status = 0)        Begin              exec [test].[dbo].[insert_t2] @c1,                             Fetch Next From @T1DataCursor               InTo @c1,@c2        End        Close @T1DataCursor        Deallocate @T1DataCursor        Go 

    调用方法

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

    结果:

    SELECT TOP 1000 [Id]        ,[c1]        ,[c2]        ,[IsHandled]    FROM [test].[dbo].[t2] 

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

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

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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。