- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
9 c. Z F( ~$ X/ o/ K/ S' Q4 B" g3 B5 R1 k5 D1 x& B& K
方法一
7 G( L! l& s. v* C( f
! g- M& c% N2 \- b& z6 W' Udeclare @max integer,@id integer. [: j% \- @ y) B2 Y6 `- o
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
( r. _' R9 ?9 a( z; Wopen cur_rows
0 M" p9 O/ [/ @fetch cur_rows into @id,@max4 X3 e" y( u& p
while @@fetch_status=0( {9 D0 L) }, F n& ?3 l
begin" m- G' D$ r, |; @2 L
select @max = @max -14 t. M! @" L. q8 A% g
set rowcount @max* J: Y& _: P4 s( ?' X
delete from 表名 where 主字段 = @id
0 M+ I' w3 ] A( n* w, H' A" _fetch cur_rows into @id,@max" \ D/ I) n) M- n B
end
3 B3 b/ ]9 \ B0 t. \close cur_rows
0 I( ]& w3 s5 p0 W- {9 t+ X# Gset rowcount 0
h% {( Z$ I9 y; o- e7 k4 t: ?, |
4 T8 ], G# ?$ J' R7 a
方法二. r" F. C T, L- Y0 M
4 W! {# k) x: ]
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。 h6 {+ O& |( O. Z+ Z9 e! z: a* Y3 {- X
" f2 R. N# A7 H' K" v0 \& q0 Z% y
1、对于第一种重复,比较容易解决,使用3 q. w. Y7 C/ Q" i8 ^
: m0 p5 d6 l; Y9 P8 r7 q9 E6 }- S
select distinct * from tableName
7 d7 X6 I$ X, i1 B3 Q0 _
! O M- S) m# d6 e5 T# U$ ]" o, F5 m) s" v8 ]! v. |
就可以得到无重复记录的结果集。
; g! z5 r+ [5 q9 d* }3 g! j( K( \' r5 J+ E) P6 Y- |+ h `
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除* m; U0 w' Q- n
8 L3 G% m4 Z+ T) g2 c* h5 ]2 Oselect distinct * into #Tmp from tableName& \( e* I& U( k( W" ?% }
drop table tableName0 K0 |0 W# O3 `! W
select * into tableName from #Tmp
, A v4 c$ V7 P& g& H1 z zdrop table #Tmp
) X; K3 G: B- K2 g2 A5 W2 t
, T' g3 C( t p. S+ n4 P1 L4 \% y/ e
# W4 _5 M b- k' J+ W$ u0 @) }" J3 y 发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。/ x8 F$ A- \( [7 d O8 j" h
2 Z& H& [- ]! u9 v
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下6 H8 A2 d; E% P. t+ r
( j: O7 s7 k( Z5 G! o, h" V
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
[2 V( f/ Y2 S5 G% Y; v6 G5 u+ C$ ^$ Y" a7 @) x4 U( e
select identity(int,1,1) as autoID, * into #Tmp from tableName& z# q4 t C" f |$ _
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID9 `& _: e9 H% }
select * from #Tmp where autoID in(select autoID from #tmp2)
/ `2 J: w4 t1 }7 Z' Z4 K2 _5 d4 ~* v$ n# M; s& {# Y( _* t
( m, V6 Q4 l$ X0 n3 O
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
! {0 D2 K# d5 l; w/ H8 b; q" W2 U, y/ Q: Y- `/ P5 E
查询分析器不能单步调试的的原因
5 t7 i0 Q' C3 ^/ C; L% I0 d, n. F7 b. @/ q3 g, v- Z3 b2 K/ _
具体步骤如下: & @! @ ~+ D3 h% r" I
, y- V& k& j0 `3 n, w 1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) ) f# B% i6 I6 V/ d8 U0 o# T* }
7 @* r& k8 p; _$ c7 x 2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; & M# W% R6 P6 X. O% G' N
7 C( W# H, f k0 m6 S 3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
& i$ K0 L0 \# _# ~% A" g1 {- G: ?, p0 F a、在【服务器】上运行dcomcnfg.exe;
& ?( r4 Q! _7 X4 y4 `
' \5 E! W% q/ p4 A% k0 v8 S b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; / W# k! K7 W( n- c' D7 T+ J. p
# ?1 p2 j! N% _ c、重新启动SQL Server服务;
+ u3 D$ ~ V1 e3 Z: L0 ~6 V' \, h
& d/ I6 G: _ p! ^ 3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 ! o* ]" u. k+ z" V
注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|