SQLSERVER实用经验技巧集[二]

来源:互联网 发布:什么录音软件 编辑:程序博客网 时间:2024/06/07 12:37
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

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



  方法一


  declare@maxinteger,@idinteger
  declarecur_rowscursorlocalforselect主字段,count(*)from表名groupby主字段havingcount(*)>1
  opencur_rows
  fetchcur_rowsinto@id,@max
  while@@fetch_status=0
  begin
  select@max=@max-1
  setrowcount@max
  deletefrom表名where主字段=@id
  fetchcur_rowsinto@id,@max
  end
  closecur_rows
  setrowcount0

 

  方法二

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

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


  selectdistinct*fromtableName

  就可以得到无重复记录的结果集。

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


  selectdistinct*into#TmpfromtableName
  droptabletableName
  select*intotableNamefrom#Tmp
  droptable#Tmp


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

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


  selectidentity(int,1,1)asautoID,*into#TmpfromtableName
  selectmin(autoID)asautoIDinto#Tmp2from#TmpgroupbyName,autoID
  select*from#TmpwhereautoIDin(selectautoIDfrom#tmp2)


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

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




  --更改某个表


  execsp_changeobjectowner'tablename','dbo'


  --存储更改全部表


  CREATEPROCEDUREdbo.User_ChangeObjectOwnerBatch
  @OldOwnerasNVARCHAR(128),
  @NewOwnerasNVARCHAR(128)
  AS

  DECLARE@Name  asNVARCHAR(128)
  DECLARE@Owner asNVARCHAR(128)
  DECLARE@OwnerName asNVARCHAR(128)

  DECLAREcurObjectCURSORFOR
  select'Name'  =name,
  'Owner'  =user_name(uid)
  fromsysobjects
  whereuser_name(uid)=@OldOwner
  orderbyname

  OPEN curObject
  FETCHNEXTFROMcurObjectINTO@Name,@Owner
  WHILE(@@FETCH_STATUS=0)
  BEGIN    
  if@Owner=@OldOwner
  begin
  set@OwnerName=@OldOwner+'.'+rtrim(@Name)
  execsp_changeobjectowner@OwnerName,@NewOwner
  end
  --select@name,@NewOwner,@OldOwner

  FETCHNEXTFROMcurObjectINTO@Name,@Owner
  END

  closecurObject
  deallocatecurObject

  GO


  SQLSERVER中直接循环写入数据

1

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>