数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… - L6 F( d- F* T" ~* G" I/ y% Z( A6 D
方法一8 D, l k& O8 \ H; T
/ v& x$ p% }' V6 k
declare @max integer,@id integer " x" X( ~$ a+ K3 {8 q$ Adeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1 ( U' ~0 R4 R+ X! y4 copen cur_rows * [+ E) g2 \" Q- d& O9 }0 U. N' c& Hfetch cur_rows into @id,@max, [- a; b2 E' U* k* P2 n( ?7 M
while @@fetch_status=0/ ~* U0 ^3 ^% K
begin 1 i. X f' D5 Bselect @max = @max -1; G% X( \' J4 C- [+ ^
set rowcount @max( l; T5 a& x: N: Z" g& B
delete from 表名 where 主字段 = @id % R! w3 ^# v, f" Ufetch cur_rows into @id,@max : Z9 m* @! c. p$ g# V5 Qend & n+ l0 g: l4 [" h0 xclose cur_rows& W1 {8 o: d6 u2 K x
set rowcount 0 , |$ V j: ^5 G! @+ ~& S# E/ c" o* q; \
5 k; _! e& P. w4 j: a* f
方法二 ! \- i5 L9 y' F4 P t. d 6 D: j# ?: q, j* o- k 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。1 h* S/ a6 W( [! K" f( T& g! J; d
! m$ ^) r% K/ U( d8 S6 l 1、对于第一种重复,比较容易解决,使用9 `- ^# m3 j: o4 I6 |& Q: _
- [" B, P5 J% ?- ?9 K
select distinct * from tableName/ c$ v" M( [1 \
2 w* E; G5 d+ X: ~, H
) e, Z3 W: K! H1 G4 a! H
就可以得到无重复记录的结果集。$ P8 v3 Y, J4 ?; ]
3 T- W' R! k9 u 如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除 5 \1 g8 B/ `, i T # h! u: Z: _7 c5 f# Y7 rselect distinct * into #Tmp from tableName# R5 y' l C& Z
drop table tableName 7 u0 s- ]% o$ A) Q% w# Iselect * into tableName from #Tmp o5 `) N) t) |7 w# X4 }3 e# W
drop table #Tmp : u G; ?( W) y
% L9 ~" |3 u& M6 R$ A, Q, C
( ?5 n0 v1 e: E# B; Z 发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。 + k0 h! J0 J1 p/ O" u4 J# T % ~1 J" W \0 m/ W! B 2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下, @3 I# ^# D8 ^! k$ I
7 @ @# d) r# w1 A+ L. H1 j8 a6 w 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集2 j$ P1 R7 t4 H' W* E: f! T
$ M i5 q3 i( B1 |; l5 X& T8 @select identity(int,1,1) as autoID, * into #Tmp from tableName , p: a2 r7 w% I; t" |" bselect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID 5 j8 j; f; `& s' j4 v9 @% ^select * from #Tmp where autoID in(select autoID from #tmp2) 9 _+ W& ]6 z8 Z- r% c" O6 `/ {' I* S0 y) @9 L# M; K$ _! N' D
+ R2 U9 ]5 W8 c$ e3 { v& }( m
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列) ) u8 d: d2 v; X4 w+ D6 V3 ~: Q* |# [2 @1 A* y4 O$ s' ^
查询分析器不能单步调试的的原因7 K* H# p# N; ~: o- S
, W% S3 f* R1 ^# A* s& |
具体步骤如下: 9 v& A( m/ w9 l% Y- p! b
8 Z( ?8 `; x/ F6 @4 u6 d
1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) ) `5 d( b( v2 }1 |" P( p
0 U1 Z% o; s% ~' f F
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; 5 l+ m6 z( M5 I' q
K8 U1 |+ g& n+ u3 y$ Q 3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: 0 P: |% E9 [( N1 F( I
a、在【服务器】上运行dcomcnfg.exe; ) F( |/ n% |) M* h: o. g , j4 B( C( h% v3 Z b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; # ]% K& G, {% m5 j# Q, S) D+ l! B" M S+ c7 f+ l' y
c、重新启动SQL Server服务; ( Z- B0 S h+ x6 C0 \2 o. L% f- m) k M* r
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 - \/ h8 y% X3 a0 o5 P: W" w+ u 注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。