数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… 1 ?0 x6 N& p$ T2 q, ~2 s h / z Z) p( D' f5 u3 Z9 ]方法一 ' W3 k/ n% U; b ' t$ y, O. N6 V- l: g* {- I' rdeclare @max integer,@id integer: V; Z' O9 C( r @' W& f. c! }. H* M
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 13 I, l6 S# C" r; B3 U C
open cur_rows4 | s9 V3 j/ L$ U) e& o5 v8 {
fetch cur_rows into @id,@max 2 h) ~) o+ `+ w5 z+ x- p/ W& k+ hwhile @@fetch_status=0 , V5 M F1 \' G9 M a6 L: [begin% e; Y5 c* O" d: M& e
select @max = @max -16 X" E: L2 R! p7 W# x7 H# P' u
set rowcount @max 0 h' D: F3 C, H. \- {( jdelete from 表名 where 主字段 = @id# Z1 R1 N* s' C6 G& E% S4 n* \
fetch cur_rows into @id,@max ) j0 X1 g: l5 C G# Cend# m0 z' o) m# b0 Q8 \
close cur_rows - ~% R1 A: `+ c: ]set rowcount 05 K7 y# K! B7 L, U1 k/ U( n
" a4 a5 G$ L8 c9 y % W! t" h3 w1 r I$ J5 g方法二 1 F! P% n/ s. Z7 L * p) Q* _% [7 \( I3 i0 q 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。# z! ~! r" j" p4 ~
; D) K$ l; e+ e, i' A0 a8 R9 s 1、对于第一种重复,比较容易解决,使用 * ^6 v! q$ D. N2 w; ]6 l- ~' z5 @1 W/ z! s# _( K
select distinct * from tableName ; v. o' ]; L3 X/ b h. X! j% u3 X! g; B9 t; J ! H! T3 |8 G1 k0 Q4 \" i 就可以得到无重复记录的结果集。 ' n+ s& z; ~/ r4 l9 X. P5 P' u% |: ?6 M5 F" _
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除9 @- v x, F' v" V# {* O' c
) e8 u% ?$ \4 x& l/ B9 U5 ^select distinct * into #Tmp from tableName 4 V, ]6 R7 l. M2 W( d' [drop table tableName1 [4 ?9 ~& P {, d/ I; z( Z7 p# K
select * into tableName from #Tmp# I2 K+ g- H* U5 L" p: k
drop table #Tmp . m1 D o* ^- X, t2 a
7 }+ K. a8 e0 Y% n) W [, d+ Z9 G" A
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。 ; N! K) b3 b+ r0 W$ ~& z, ]5 {( w: ^4 G( |
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下 0 k N5 {6 f W/ p, S. e9 P+ F) B Z0 G# s( c
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集% t3 b, ]9 D0 \+ Q! R
& Z" s/ V" L( \; xselect identity(int,1,1) as autoID, * into #Tmp from tableName Q2 U5 v# J4 z; g
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID5 z7 S7 Q, ?' a3 w- L
select * from #Tmp where autoID in(select autoID from #tmp2) 2 i$ s3 C$ p3 @+ Y( a 3 B0 w& \4 Y9 b5 v ' m- M. `* W" l4 g5 m/ v0 Z 最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列), w b+ o! p7 f0 _, l) S5 r, A
|: w. Q' Q7 ?7 I
查询分析器不能单步调试的的原因) X' J, }% S1 w+ H/ |
4 x& }% y, g2 @5 w/ b
具体步骤如下: # x- c: y1 h. o' p7 m9 |, a6 s+ l
0 J9 y4 c2 a9 O9 a 1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) 3 n: J7 Z$ j1 s% K
8 h" U! {/ b! [) @' D. ~) v
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; ' \0 M# b$ |) M, U+ _* ?7 W: M/ X: e% a$ m
3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: + g& L8 T ~# p; w- U% t0 u
a、在【服务器】上运行dcomcnfg.exe; % V% S% E4 H! W/ A/ ~; E 6 i( E j) t+ B3 |% E2 L! v b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; ( [( t" z+ e0 r! e2 h- V5 p9 W7 c
- g0 K! A) I/ }8 p c、重新启动SQL Server服务; : d& q6 P( t; _# O% H- Z- `/ e8 C2 ~4 H. ~6 P: D3 K
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 6 o8 P% S* N) `: q+ ] 注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。