- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… . G7 `% a" f; S: Y
" L- R. |4 C$ a6 K: B {方法一
/ M+ i& m7 Q! x6 X x5 S8 u: K; [7 K9 }# k: M- j
declare @max integer,@id integer
$ M" ]; }5 V) P0 N. W0 t7 Rdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
/ j% A o3 U. |# z# Qopen cur_rows. @) x5 ~5 |$ y' e
fetch cur_rows into @id,@max
" n9 ?/ l; W1 r, i0 twhile @@fetch_status=0
+ _; O2 c& D* `. }begin
& Z) l' X+ r9 a% q2 ?1 Vselect @max = @max -1: \1 z7 W! y9 r& b
set rowcount @max* \4 G8 b5 @% ]
delete from 表名 where 主字段 = @id' P$ k4 L" } l8 Y0 L7 \
fetch cur_rows into @id,@max
' V) X O" k; N% s( P; ?' f8 N) ^+ p$ wend
! U, K0 u% n5 W; a0 ^0 {3 X# _8 Bclose cur_rows
8 f* E9 u( O2 G" Oset rowcount 0& I* p- `# ?- w* b m; [
8 ^& t5 R8 _, c5 t) ~' |( o9 l
5 K2 _4 [9 j+ M* m) U方法二# Q9 H& t: j5 t, o u
. j* M8 Q5 {3 c2 P- i
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
, g' l" Y% D' Z3 y1 \+ Y
i1 N; z+ E/ d2 ^* _5 s0 W 1、对于第一种重复,比较容易解决,使用3 M. S! p" e. t- \$ ^5 F
; u$ G( }) ^0 w5 z. cselect distinct * from tableName( g. [2 b% }$ u; V) V3 Z' x2 j
9 n- y. d! I; Z5 V' o! V- ^
( g( }# b& v9 m. T4 r5 f 就可以得到无重复记录的结果集。4 O" V4 P4 d# v
$ C: {% F: F! @
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
4 X* E$ A3 @9 n- Z- x) E4 S; G3 Z+ r$ ^( `# ]% J
select distinct * into #Tmp from tableName
" J/ b, c5 z! d" W& d# A3 i0 V6 Qdrop table tableName
4 p9 H& {; S3 a$ c# Jselect * into tableName from #Tmp7 h* P) j o, B' K
drop table #Tmp # V: l8 h! f1 p+ C; P! _
' T# {9 H1 ]' ^) J" h) n' u4 K% n$ s
1 j: H3 l6 m( e! J( X 发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。6 G$ a8 k+ C- l; U W
: V# C* v4 A2 `& r9 B( [ 2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
, [6 ^9 v! K- {5 i/ k7 H' j4 x
. k. ]: a9 ?& `/ O9 j; [ 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
. Z% p5 `( V& c1 q% G, p; c7 q* y" R" g# L+ ?
select identity(int,1,1) as autoID, * into #Tmp from tableName! f% q/ y# [! V2 Z" G9 S1 e
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID7 V8 e2 F/ L N" m2 T
select * from #Tmp where autoID in(select autoID from #tmp2)
1 \$ ]/ K0 d( H
j4 s7 N6 `- W, o" w0 h8 q H5 q! F0 B1 s- \
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)+ f4 u+ @# f4 z5 j7 v8 E7 L) k
* m! M* Q9 z- }
查询分析器不能单步调试的的原因; F! F" d; m# [6 P# j; o
! ` k5 e: R7 f' Z9 A 具体步骤如下:
5 F5 L* }1 u' p- n0 p! ~( r# N, w
1 M* h6 U4 O' [6 K1 h) J# M! O 1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) 3 i6 Y2 i1 D w* }
! a' x' x) q3 E
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; 7 g( E3 `, {: E
0 ~; J% T- }& y7 J5 q 3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: ' j* A3 U& A8 y1 [& c4 Q! `
a、在【服务器】上运行dcomcnfg.exe; . e% @: D. ?5 x) ^5 S. A
5 T$ k8 E' n' f
b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; / R. q" K1 s0 u* t% C6 Z
' Q/ T( [5 e6 o6 ~+ E6 f' y
c、重新启动SQL Server服务;
" s+ W7 N, z" A0 T
% L6 W X( @$ ?8 _7 s0 e 3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 6 k3 O x$ Q8 w, w) G! I" z
注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|