日期:2014-04-08  浏览次数:20490 次

  删除数据库中重复数据的几个方法
  数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… iTbulo . c omOZh1q




  方法一iTbulo . c omOZh1q


  declare @max integer,@id integer
  declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
  open cur_rows
  fetch cur_rows into @id,@max
  while @@fetch_status=0
  begin
  select @max = @max -1
  set rowcount @max
  delete from 表名 where 主字段 = @id
  fetch cur_rows into @id,@max
  end
  close cur_rows
  set rowcount 0iTbulo . c omOZh1q

iTbulo . c omOZh1q

 iTbulo . c omOZh1q

  方法二iTbulo . c omOZh1q

  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

  1、对于第一种重复,比较容易解决,使用iTbulo . c omOZh1q


  select distinct * from tableNameiTbulo . c omOZh1q

iTbulo . c omOZh1q

  就可以得到无重复记录的结果集。iTbulo . c omOZh1q

  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除iTbulo . c omOZh1q


  select distinct * into #Tmp from tableName
  drop table tableName
  select * into tableName from #Tmp
  drop table #TmpiTbulo . c omOZh1q


  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。iTbulo . c omOZh1q

  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集iTbulo . c omOZh1q


  select identity(int,1,1) as autoID, * into #Tmp from tableName
  select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
  select * from #Tmp where autoID in(select autoID from #tmp2)iTbulo . c omOZh1q


  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)iTbulo . c omOZh1q

  更改数据库中表的所属用户的两个方法
  大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了,原因是建表的时候采用了当时的数据库用户…… iTbulo . c omOZh1q



iTbulo . c omOZh1q


  --更改某个表iTbulo . c omOZh1q


  exec sp_changeobjectowner 'tablename','dbo'iTbulo . c omOZh1q


  --存储更改全部表iTbulo . c omOZh1q


  CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
  @OldOwner as NVARCHAR(128),
  @NewOwner as NVARCHAR(128)
  ASiTbulo . c omOZh1q

  DECLARE @Name   as NVARCHAR(128)
  DECLARE @Owner  as NVARCHAR(128)
  DECLARE @OwnerName  as NVARCHAR(128)iTbulo . c omOZh1q

  DECLARE curObject CURSOR FOR
  select 'Name'   = name,
  'Owner'   = user_name(uid)
  from sysobjects
  where user_name(uid)=@OldOwner
  order by nameiTbulo . c omOZh1q

  OPEN  curObject
  FETCH NEXT FROM curObject INTO @Name, @Owner
  WHILE(@@FETCH_STATUS=0)
  BEGIN    
  if @Owner=@OldOwner
  begin
  set @OwnerName = @OldOwner + '.' + rtrim(@Name)
  exec sp_changeobjectowner @OwnerName, @NewOwner
  end
  -- select @name,@NewOwner,@OldOwneriTbulo . c omOZh1q

  FETCH NEXT FROM curObject INTO @Name, @Owner
  ENDiTbulo . c omOZh1q

  close curObject
  deallocate curObjectiTbulo . c omOZh1q

  GOiTbulo . c omOZh1q


  SQL SERVER中直接循环写入数据
  没什么好说的了,大家自己看,有时候有点用处 iTbulo . c omOZh1q

友情链接: 爱易网 云虚拟主机技术 云服务器技术 程序设计技术 开发网站 APP开发教程
Copyright © 2013-2024 爱易网页 当前在线:556人  网站在3时23分49秒内访问总人数:64907人 当前 27.85%  粤ICP备18100884号-2