- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… , B2 {+ V4 [, `8 v) K: d
$ Y4 \4 ]/ D I" D% L- L
方法一% h( h7 }. b7 m
$ J" ^* @/ O- H. i' `( e
declare @max integer,@id integer5 \. `% @# i: a y" `9 i
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
, T# y: ~( F( E1 [open cur_rows' i+ q9 t! o0 F) b6 H
fetch cur_rows into @id,@max! n) j5 L' @$ q
while @@fetch_status=0
% U' p. \4 N; s/ O0 ~( gbegin" Q9 `. y% ^( U" J9 D; {( x
select @max = @max -1% X1 r# }+ k, z/ F) [$ S8 ^
set rowcount @max* r# Y# x' l1 h8 ]+ z
delete from 表名 where 主字段 = @id6 @- p) n3 m2 v8 b7 C7 H, B8 m
fetch cur_rows into @id,@max$ u- L5 l! I: E! ~1 o U
end
# u! H( Z' ?* \close cur_rows
" c4 K( \0 a6 ~/ N1 i) lset rowcount 0
6 h. s+ i7 S/ o
' x( `" B; c1 v) a2 g/ c* @, S1 Z5 M, {) h/ V y+ E
方法二6 m8 p+ J2 X5 N9 D
% |% J) [* |9 V, K% B% C" x 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
4 P f A% q( m- }+ s) x5 O6 M- j
( b0 {7 y% z) i, m! t8 O 1、对于第一种重复,比较容易解决,使用
, f' v: r4 \6 h+ X5 {+ Y& d6 _
% l/ r: [- R$ e2 X' g1 u: ?select distinct * from tableName
8 | F7 Y) b; h) J8 F4 X0 s [& t6 _
" q) o; L7 i- U! C" m) K$ a! O. e, l. S
就可以得到无重复记录的结果集。
; j3 ^! s9 B. @
7 N- X* i, y+ l! V9 T# a: c$ p 如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
# I2 ^. M5 |+ P8 s& e) Z6 c1 G) Y: [6 L3 \' X* s( ]
select distinct * into #Tmp from tableName$ M+ Z/ n3 \5 T" X: C
drop table tableName
- d. S7 }( F* ^# O4 g6 F8 Iselect * into tableName from #Tmp+ i5 Q8 h* r: {" \
drop table #Tmp
! o$ Z D" A6 u+ F. P
6 g2 O- Y8 q0 x+ H: w5 S* E1 T d: C0 w1 [
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
; ~- ]/ c; f5 K7 S7 f) a* C; a& z
& B9 H4 N+ {" N8 {7 m# z 2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
4 L4 v, C+ Y$ v R" w5 g0 _
8 u3 g, e. K5 I7 D! L) p 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集$ {$ T% M; Y4 } ]% A/ `& g M
) S9 E# r0 R% q8 Q3 ?9 Pselect identity(int,1,1) as autoID, * into #Tmp from tableName: m4 _+ K o2 Z, |! C9 ]" y
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
+ \" N- o- U5 |select * from #Tmp where autoID in(select autoID from #tmp2)
$ u' o; y) L0 C; B/ \9 e; d$ t/ [; Z# e3 Q1 h# x6 M& s5 W2 ^
" L- R [( T5 `1 N x' {
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)4 l; d) o6 }8 e( D+ l) T
" b- Z+ S; j B3 i# {) l" ] 查询分析器不能单步调试的的原因+ X3 M4 d5 D- i- M7 m" _
6 o+ W. r) p# I# m: m6 O7 z$ R 具体步骤如下: ! I/ [5 `3 Z ]+ \, s- t+ g0 ?9 z
2 ?: R, x& |1 g, h3 i7 S 1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
4 `2 P+ J& _6 ^$ l% j; H3 g% G% s. w# c) Y
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
3 X9 k6 A7 n6 @+ c$ @$ @9 p7 ~7 B" u4 I$ ~4 q8 n: }. ~
3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: ) h+ o0 U( M4 |( p+ z* Q
a、在【服务器】上运行dcomcnfg.exe; o8 T, f8 H' u; p$ b
1 B# y- K5 G3 A) H1 P0 ]
b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
8 Z7 a0 @: k% G: I
# m- o% J0 g2 [ c、重新启动SQL Server服务; / C- ]" L! ?9 | C" m" D
# _- s: X9 z3 U7 w# B. |6 @+ `1 |
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 2 g; y2 H r+ r" d9 x
注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|