- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… 4 p0 n& N9 i) n+ q% ]6 P0 m
2 T. p5 [2 @9 b0 {$ S方法一7 ]2 }6 G. q" ~4 d+ n3 Y) L8 m
$ H+ k7 l2 ~0 w" Y( p) Udeclare @max integer,@id integer( R) `; |5 v! Z/ x
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1- C: ?7 r/ T8 a0 H9 ~* k
open cur_rows
" Q9 f+ h3 X* jfetch cur_rows into @id,@max. Y. J4 p X: {6 q6 d6 ?( H
while @@fetch_status=0
& j% u9 \8 m, L( X' L& D Hbegin& y$ @9 Z/ ?/ g
select @max = @max -12 t4 r1 g- P$ x$ I& K, }: R
set rowcount @max
5 d( _0 F8 h; h1 x& x! e; x; udelete from 表名 where 主字段 = @id
4 N) N- u% t# xfetch cur_rows into @id,@max I: D3 b% _5 b6 G5 L' t
end& @! Q# E# f% _4 v" [
close cur_rows/ r* {. X. s+ g8 j1 W# [& v2 L
set rowcount 04 ^- G/ ?) \6 F" }9 @' |
) U7 k" |9 A; a7 H% p" x( J# P6 N" u6 P
9 u& D$ a5 ~" e4 X! `& y方法二
0 ]1 v( ?- [& `" N$ ?" A/ h( [& r1 \1 F L: \$ ^
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
; A2 K g% N6 p2 L+ D9 D
% N# p. l8 Y" q. |: H* P9 B 1、对于第一种重复,比较容易解决,使用+ V0 c' w* U$ p7 D2 a. B
, w& ]. z/ S9 w9 [
select distinct * from tableName
! r3 Q6 k @) V `* E5 k
2 n( |) D% M9 |) L: m6 }2 r8 z& m: o
就可以得到无重复记录的结果集。+ q( ]( G3 w3 p6 |* I
6 y0 S8 S: C9 s. [1 d2 n) D 如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除; K7 [" P( i2 i! c, n, ?
0 p& Q! M3 R! [
select distinct * into #Tmp from tableName
0 ?0 y1 W- ?: h; ?7 w2 J9 f) rdrop table tableName
1 d' p; |* Y6 [6 nselect * into tableName from #Tmp0 k. }' g1 U. h+ r& s( `
drop table #Tmp 2 e: x$ c, c( m5 g# c6 |! E
7 B4 l9 P* q7 }. ]) z2 ~$ s' {3 _
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。3 p+ f- H3 m7 k: |3 {
" K9 g# c2 K3 j- R( A4 e
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下/ S5 Y% {. v. a' }$ Q
) s7 c- ` r1 d! D) d* L
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
, U/ B) y% I/ @% y, d
0 I5 E& y' J2 I1 Jselect identity(int,1,1) as autoID, * into #Tmp from tableName7 T+ K3 T7 L! ^. o
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
4 c6 j z& e O6 h C) Nselect * from #Tmp where autoID in(select autoID from #tmp2)
8 N' i. K3 P9 ]! e4 h5 J8 U! N! q8 b- `4 I. c8 F, G6 I. V
! Y- v1 P+ e6 Y- s8 R- \
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
" z. B4 u$ N; Y* L9 K
/ b- n: @. L8 c" }" F, M 查询分析器不能单步调试的的原因# J u- G9 w; \7 ^4 M# F; ?
% y: s3 B. ^4 t8 c
具体步骤如下: 1 z: D) j+ ? ] l
1 W4 D) ?3 ^2 L l0 i6 b3 @- @8 Z
1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
' G" @& x# D, L5 {. N# M" o4 ]1 X" x+ Q- Q+ x% j
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; 9 p; b- H: y) Q, b1 |+ X) g
; W; ?: X `/ R. O5 j, y 3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: & L5 R7 L# ?( ~5 }" i& s V& n
a、在【服务器】上运行dcomcnfg.exe; / k0 i2 }( a1 E1 E+ B& k" L. }
; Z# [3 Y D8 I b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; 3 g. Q$ R) R' w
1 V, b# z9 e2 O5 K1 j; e
c、重新启动SQL Server服务;
! r5 }) e5 G' A5 T1 g0 C% [+ x; E1 Q3 j" H6 @& P; R
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 # Y( V' O8 s9 w& I+ ]
注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|