- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
" }0 Y! M) e |4 [! j+ {
N! x9 P$ n# Y/ G R方法一' ~: o" U! S& d
0 Z0 ^* y* ^ n" X& w7 T) hdeclare @max integer,@id integer9 g! Q* x2 K9 q# {% Q
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
* g4 P; k3 x1 L" y' ]1 |% H% u' Fopen cur_rows
* T( R7 v' q5 s1 m0 vfetch cur_rows into @id,@max0 R- N/ \1 c& |8 ?, s9 h+ y
while @@fetch_status=0
$ K7 |$ C7 o) A {begin
) {) f: r4 r2 Bselect @max = @max -1
$ U/ m, F0 G( q3 j- d {set rowcount @max
9 U5 c; M6 i. Idelete from 表名 where 主字段 = @id% t6 N X% {1 m6 v4 M# y" ^4 ~) s
fetch cur_rows into @id,@max, K1 I/ Q) {% R5 R9 q
end
8 m; e/ R. ^0 X( d" tclose cur_rows( E. k% W! R6 Z- N
set rowcount 0
* p4 r% ~$ R5 b' }( G7 H. E! X- T. ?+ ?% l! g6 W6 g6 l
/ d& a7 F: k4 r# w, O7 g8 ^
方法二0 G: s& P* h3 k4 |+ d# G
* D: Q! m, k8 @4 d, \4 \
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。8 a$ l/ @% A3 v% U
# v1 h! Y5 b. j
1、对于第一种重复,比较容易解决,使用) j$ V4 Y) Y) [ y% a w
: {* r8 z0 v, Y: e2 Yselect distinct * from tableName
& G8 c, V( C, s* x) u) H- M- m# y& L2 m8 |& ]2 G7 a8 y
" ^8 _, N8 q1 N5 d 就可以得到无重复记录的结果集。
1 [, y! L1 A V! w: M4 [9 g
* e D. l, l2 S! ^ 如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
9 a4 _6 I: Q" C a, c" V3 i" b8 s( a9 d" u) _8 b7 w( e1 X) d
select distinct * into #Tmp from tableName
/ d% y4 O) i; v% |: ? Xdrop table tableName
! B3 G# S/ p7 r3 {, z) j6 Lselect * into tableName from #Tmp' y# u( Q# z7 ?" L0 \
drop table #Tmp
" ?0 U' B+ i% K
' T( D* u0 x8 I# h8 u5 n# D. D6 s# }
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
O9 r+ {4 D V: l `- e, ~& d* N' ?: @- V- u6 @, X
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
" e9 O" \3 Z4 M" _4 Y( o1 J) V
: T4 y7 I) Q: [+ J 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集: u$ d- s! X1 N
% O# O6 C9 v: R* X; R# Nselect identity(int,1,1) as autoID, * into #Tmp from tableName4 Z* }6 o9 J; J2 H
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
# N+ W x) x/ [2 ^select * from #Tmp where autoID in(select autoID from #tmp2) ( F* x5 m0 L7 d1 b( ^5 [! I* R
5 \# Z4 p" _7 C7 K/ V
1 o# p" k; N% d7 W! p g 最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列); }# o3 n8 Z( \
4 Z: b' U- S7 y' k- f% n9 U9 Z
查询分析器不能单步调试的的原因
" Y5 j5 `! a0 y& w& s) ?- p: t* Y7 T1 b& Z7 q/ f% b$ u
具体步骤如下:
* a) _7 ?' b& W6 S) P
2 ]- t* |9 t; m1 f8 N7 } 1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) 8 u2 _/ p Q5 Z1 Q- t j
1 M, k5 h X+ h* E( m! z; q% ~0 Q
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
+ R9 m r3 z5 Q/ z/ Q. [ o3 P3 b/ K2 @6 R% D6 M
3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
1 F1 \6 B9 U) k1 `' A) ?: N' { a、在【服务器】上运行dcomcnfg.exe;
/ w5 [/ Q6 s( C3 \$ Z: a9 J; q+ N3 I/ D9 n* E, f% B6 C
b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; ]/ }$ g) q& h* z2 i
; A% W2 c0 i( t' `" J c、重新启动SQL Server服务;
B; K5 S; W, Q: I6 h& A
! u+ {: _4 `; }: L( N) b 3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
* j, _5 V' h5 w5 y, z5 q" A5 L) ~ 注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|