- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… 9 v4 D4 q" e; z* Q) |& a, h7 H2 n
, T6 }! B1 F6 R8 N4 ~; L方法一3 p) n" Z P* a. r
" w1 X1 Q3 d! p9 V7 ?6 r5 z: B4 @declare @max integer,@id integer
( X, j5 k! t" J3 r) kdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1: F t: g! _; }$ l% ]8 d
open cur_rows8 W/ v$ }. J/ o
fetch cur_rows into @id,@max
8 i4 F3 H4 t1 o9 ]while @@fetch_status=0
0 c! s' s& j) D( u$ p% m* Qbegin2 Z( K& e; N9 P0 u; Y
select @max = @max -1
4 F/ P1 y' B s3 l; }set rowcount @max
( M/ Y, E+ Y/ t2 s6 xdelete from 表名 where 主字段 = @id- J# K- J8 k! p4 f: s1 L
fetch cur_rows into @id,@max4 g, Y6 I f, p Q" m# ~, f" s
end: X7 ?1 G; L, t" ]" L0 j
close cur_rows
( Q2 w! q! H" L1 J! E0 O4 Z7 \set rowcount 07 e C( l0 W% m0 j
% M6 V0 i5 l9 a$ u3 u
2 k* l: J- j7 g; P. O9 [方法二4 p, \8 W. O, f8 N/ n* Z; T$ g" E* A
! a# Q/ e" V0 W3 v% b) S } 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
7 |/ J. N% Z" q [: M/ Z% j
+ }7 q: B y! m8 _$ p 1、对于第一种重复,比较容易解决,使用# N1 z" V8 K, z% e
* k9 b5 L# a! \+ E& T
select distinct * from tableName
/ X# W& c- O2 O, B1 p9 w5 V; ?/ j8 Y* Q3 f
$ V# X+ B6 A; A5 d7 Q$ V5 }5 s 就可以得到无重复记录的结果集。
8 p/ o! O5 n$ _) W" N" s# H! R! ^5 u$ c1 ?+ [6 @* n
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
# ~/ I; v) y1 }/ O$ _3 E9 m& t+ _2 W! P3 I* K6 d5 O& ~
select distinct * into #Tmp from tableName0 w5 _6 b( v5 k# Z
drop table tableName
% w# B: A; E- x; N) h2 P3 Qselect * into tableName from #Tmp, ^) F ]# S: d
drop table #Tmp
. k3 @( n1 u I
: S/ Y6 o0 k# D; @% G( t3 J' E$ R' f$ Z+ m, |
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
6 o+ }" h7 T+ ~: r7 H# K: J4 ?. H1 h- k( } t& l0 u
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
, _' j' L! t9 d4 i3 @, y w- U
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集( N, Z* j' N+ }# r- s
. `& |& Z0 v+ \. `! @select identity(int,1,1) as autoID, * into #Tmp from tableName
$ L* N0 I- @0 ?0 uselect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
; s& Z8 \# v+ Z$ c# J+ ^( |: |select * from #Tmp where autoID in(select autoID from #tmp2)
4 p8 u X. _* E0 E, y4 \3 k. I( j, e/ d1 ?
# g4 x, o. P- U7 ]4 k
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
) I$ p/ e3 c7 W6 ]- x
$ h, ?. ^1 {4 B' L 查询分析器不能单步调试的的原因
; m8 M& Q$ ]9 Y, a+ g; t, ]: s
' V6 g9 N7 ?/ B4 n. x z7 X 具体步骤如下:
% @* i0 `- p9 [8 z0 Z. V2 e! \) s; Z y) G7 p! ~
1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
' X( \! T9 W8 Z2 |
7 @0 r, Q! p3 r- E 2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; G1 R& n/ B3 I& n& V; S0 x
/ f' J% `' l/ D+ W' x+ _) A. f
3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: $ y1 n) O! A+ H2 R
a、在【服务器】上运行dcomcnfg.exe;
3 ?3 L5 J: W! N+ H. S
7 f K, K) [" w! F b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
4 Q* Y8 O3 K) z8 G1 Y" v B( t% F; ]$ T' L9 _6 e7 {9 m5 Y4 V
c、重新启动SQL Server服务; * f( ?, W2 n5 v( Y# S) f
% U* M, u+ _) T
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
5 a) @; ]& |4 J 注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|