- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
: a# M' [: T/ ~" x# u2 N3 a( B! j- r1 z5 z! _' |9 z4 ]
方法一
4 s( I3 b0 W* C, }5 e4 Y6 V( g' b, j! O( R* \; n+ e4 _& y0 P+ ~ d& i
declare @max integer,@id integer
# x+ O ^+ A$ t! Rdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
8 g# q6 q7 ]7 j: Zopen cur_rows
# C" v2 F: `# Z. kfetch cur_rows into @id,@max
# J1 R7 E1 k# s% `3 [' uwhile @@fetch_status=0
/ w+ h# x/ l& v* s5 Ybegin2 s" l% J8 G6 d, j- o
select @max = @max -13 K* R7 e$ l5 {" w
set rowcount @max
& @/ X; k7 A8 a4 G& |, Z4 Jdelete from 表名 where 主字段 = @id9 T- {5 S. ^ d" f8 g1 I! @
fetch cur_rows into @id,@max
! _$ u% ]0 k/ ?0 O( }end, a! L2 P+ v- Z2 s* M4 e0 B1 z
close cur_rows6 T# n: i" r& x2 t. ~1 s
set rowcount 0; _) a) F% E4 p+ J
7 r% Y' \$ Q( w) ?; r# t' g- d1 x4 I6 L N) D* C M, a- I* G
方法二
% k" G9 T+ C- ]
4 Q, Z3 s3 p. z4 m) B 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
7 M& B) h9 G: K$ G! K7 g* v
3 h# t" H @, y9 Z% s& B 1、对于第一种重复,比较容易解决,使用5 F/ k; q7 b; M5 G3 Q; f
0 k2 b$ r6 w5 [+ c9 d3 ~7 M* [
select distinct * from tableName
$ v, h* A) W9 b k& i: @; d
/ I( b* k5 u) b7 }0 c D: H5 k+ ^1 O8 v4 E
就可以得到无重复记录的结果集。
6 Y$ h7 d+ l( t# I5 h+ _0 w; A, U
. l. e1 k% r5 \2 b/ W9 D, |, ~) j 如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
7 E7 I( d6 Z$ q% N3 c
+ Q' v. u+ s- N) V5 g* Fselect distinct * into #Tmp from tableName8 r2 e, c1 @+ _3 m9 d7 h; i$ f
drop table tableName
& [% _+ \9 H+ `" o6 r7 Wselect * into tableName from #Tmp( V% ^$ L) o" G5 |( m+ C; V
drop table #Tmp 5 G3 G# [1 D Q' c1 ]/ e, N
( k. q- m' o) C2 H! o
5 G m6 Y N+ b6 n* m( O 发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
$ f3 r% G/ J5 }( _! Y$ {; h4 f, `
" j9 |: f7 A7 } 2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
6 |+ t& E+ _7 N5 A8 W4 ^" ?/ Z) D! ]5 n& T
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集: g1 J* H( J! @$ V+ n
- X% l/ l( X- ], g* T6 Iselect identity(int,1,1) as autoID, * into #Tmp from tableName& y8 C! ^) F# U, G
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID8 U/ N; Q# u* X1 R
select * from #Tmp where autoID in(select autoID from #tmp2) & Z. g7 e4 D: K8 v4 B9 ?4 [
% n% T* J9 r6 V- d Z. | w
- n7 L2 [: Q0 u3 L$ Y% y
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
" n# ^/ S( `6 Z& H" `& f$ C, k: X# Y- m7 X9 z
查询分析器不能单步调试的的原因
4 Q( Q8 N' ^( G; o( r& \3 U$ K0 g# p$ V- m6 s' }
具体步骤如下: ' z) G0 ?4 H. f6 ~5 d) V& K9 }9 ^
- F! L5 K4 x% E5 I% m 1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
" s% D% A5 X, X4 N9 i$ O' q0 g9 R2 m/ n+ [7 m" ]3 ]6 P
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; " H2 X! R8 c- G. |" [
& m5 o+ z/ {6 s; C4 {# G5 V 3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: : V) m+ l, ~" o3 h+ _
a、在【服务器】上运行dcomcnfg.exe; 9 V+ ?9 D5 Q( }; O
% C% f: [3 L3 z# c b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; $ _2 x) R/ }0 \3 u. k$ J' I
* P f) n7 X+ q' j: {( s1 U c、重新启动SQL Server服务;
' g( B3 r6 z1 _& L- m" _ S$ e( ?( [! g$ E3 t: [7 G5 F
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
7 B% P* l+ J* s& ~, V: n" { 注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|