惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
小众软件
小众软件
F
Fortinet All Blogs
爱范儿
爱范儿
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
C
Check Point Blog
博客园 - 聂微东
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
A
About on SuperTechFans
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog
宝玉的分享
宝玉的分享
Jina AI
Jina AI
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - GDLMO

给12306的建议 在delphi中引用第三方控件时,找不到dcu的解决办法 使用SqlBulkCopy时应注意Sqlserver表中使用缺省值的列 在sqlserver中使用bcp自动导出数据的方法和注意事项 无法识别的属性“requirePermission” 让单元测试项目也能同步测试主程序的APP.CONFIG 水平太差,虽然认为Linq是个好东东,但有谁能教教我,怎么调试? Sqlserver 插入一条记录时,不重复插入的办法 dnn5.5.1的配置 动态生成ASP.NET按钮时要注意的一个问题 关于EditUrl与NavigateURL的调用问题 DNN常用的几种页面跳转(EditUrl和Globals.NavigateURL) The Auto option has been disabled as the DotNetNuke Application cannot connect to a valid SQL Server database SQLite3中TimeStamp的使用问题 博文阅读密码验证 - 博客园 在DNN中使用SqlDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues)始终无法获得返回值 在DNN中使用jQuery的插件Validate Enter Null Values for DateTime Column of SQL Server(转) Web.Config和Sql Server2005连接字符串总结(转)
sqlserver,将视图或表的记录不重复的插入到另一个表
GDLMO · 2011-08-13 · via 博客园 - GDLMO

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

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

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

这样逻辑比较简单,但是效率有点低了,要与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')

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

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

方法一、利用唯一索引

建立唯一索引 

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


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

将数据插入T2的存储过程


调用方法

结果

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

t2的查询结果

可以看到t2只有9行记录