- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… ! m$ W0 n& \! `' j2 W: z
6 o: _+ {" M( s! n) l. u方法一
. p' q1 P( X# i- m8 @; j
2 c" t6 d# B$ ldeclare @max integer,@id integer- l( {3 `6 N! N) t* o
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1/ R9 g1 \3 H7 O% u
open cur_rows
[4 d8 M. j8 Q. u; {: f8 [! g/ gfetch cur_rows into @id,@max0 o4 E7 G' r% t; ]! }
while @@fetch_status=0
6 j" W: y' y" u" H+ q: f* [; ]( dbegin4 y% s* |8 m4 U0 g: f
select @max = @max -1, X8 Z3 t3 V3 E$ _
set rowcount @max2 b7 X8 n1 a7 g4 h. ]4 c# P
delete from 表名 where 主字段 = @id
/ V9 o% k0 ^- l; \fetch cur_rows into @id,@max
* Y4 t, u C0 g H0 yend
( J/ f0 P4 I5 h" Mclose cur_rows& g/ {, v- _" K/ x- _) R( w
set rowcount 0$ J' g# I' ?& u0 m) `
5 w, ?4 H& K0 `5 z0 U2 ?: `* T: J* u% p
方法二
8 i: {" }! \8 }+ ?/ f8 p7 \6 v5 @3 U v* e* y- G
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。. j4 }: U# G, n- B( m( C: r. C
8 {+ r) z( e+ u7 w
1、对于第一种重复,比较容易解决,使用
3 g6 q" c/ [' ?9 Z C% H$ ]
( \ y$ Q' z8 j0 u: P- O/ Iselect distinct * from tableName
: v9 s- V9 F2 E, ]; @6 p
5 X7 h9 G; l6 {/ T8 W/ g. T( g7 d# ^* P |, P( @, ?, E
就可以得到无重复记录的结果集。' I7 [2 A/ ]3 F' U& r5 z) q
8 E% B }; g. w* z4 M9 }; f7 Y
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除, T, H* F9 Y) C0 C
# U8 j( f2 k+ e
select distinct * into #Tmp from tableName
$ {' J! K$ Q( @# F. b7 v0 V8 idrop table tableName
$ S* v' R7 U. [) e2 e) Uselect * into tableName from #Tmp0 c* j* G" s: G9 Z0 P
drop table #Tmp . H3 o+ y% m- U' J
- M' T3 {. ^ q. T7 K
; c4 X9 _2 F0 |- Q; |! M 发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
- s8 U" C5 O5 j; K# R
; l& a" j* I+ Z7 t7 v" y$ K, T 2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下) I5 j v0 n; L& F4 q! B8 k& a
5 |; }) y3 w1 D: f7 l. D 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
' d6 V+ t) s+ y! Y* h5 }( |. Z) g% O) B9 c
select identity(int,1,1) as autoID, * into #Tmp from tableName+ j2 a, w* Q7 {3 q5 B$ `6 m/ T3 \, j* R
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID5 c# c5 H% d+ R
select * from #Tmp where autoID in(select autoID from #tmp2)
" a1 J" l5 ~. j; X
- q6 H) j! T7 i6 O( z& l1 _$ l! `) d5 K B" N4 |! u6 S9 [. e2 ]
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
9 ^% N B5 J. O! v- `
4 I9 U, @, h% F- l! D7 P: w 查询分析器不能单步调试的的原因. j5 l( B- W# y' ]0 c: o
8 W' G- V3 M' t+ R5 }4 F; R
具体步骤如下:
- p' ]+ P' D$ j0 t7 D/ r/ N
" x5 G8 [/ y- X+ D 1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
+ E! i9 L0 F; Y2 I1 D2 c
4 G( C' I& l6 U6 z0 F$ R. v 2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; ( V% {# }" V7 P0 l. A* D7 z0 X
+ x+ m. B9 E! o: f" m- D! ` 3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
* k" D* Y* o% d! S# L a、在【服务器】上运行dcomcnfg.exe;
4 K7 {: t0 O1 K' Y# r: w0 L" N4 b' [5 e: C9 |
b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; & E# `+ }& q5 h( U3 c+ F
" x4 l# H2 C* O# d# M7 t9 @; S; U
c、重新启动SQL Server服务;
8 i4 W7 b* ~& z3 V8 i: i7 ]* Z4 E: W! u; @& R
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
0 f3 x% ^! _( W8 A% n 注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|