- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
4 T9 @# [7 P8 y) i% p+ G6 |1 J- ~* b/ W' q2 I3 H' r
方法一
, A8 ?- u2 s/ W" Z s1 l5 Z
7 ^+ ~6 A& q3 _declare @max integer,@id integer+ M! v. D& p; A! r% P
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 10 c! G# T# ~8 U o- i; D w
open cur_rows
1 X! {9 Q. B% {* u1 g8 `9 b& q+ T5 g: ?fetch cur_rows into @id,@max
0 t. `' z3 _0 k" |1 Pwhile @@fetch_status=06 w x: y0 W# I' h
begin7 V! q& I( d7 Y3 q5 C$ h( D
select @max = @max -12 I9 M( l8 S" I, V4 z
set rowcount @max
, P; Y7 l. X- R* hdelete from 表名 where 主字段 = @id, \) {4 P) F6 |0 D5 h. q
fetch cur_rows into @id,@max# U4 |7 e& Z7 |1 B
end' m* y+ o! R$ w( f P0 ~2 t
close cur_rows
% O9 e8 t! D6 y5 e7 q: @set rowcount 0
9 }8 k7 o$ h" W5 _
$ D" D: n9 G2 W1 S/ \, F: R5 B+ u1 w) K" R' W0 Z
方法二( N% ]3 n6 q2 Q- g6 h# ~
: t5 |9 P% \4 `) D5 D2 q 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
, C3 i( J) {2 x s$ U
8 V8 K( M# `- y8 r: k" o 1、对于第一种重复,比较容易解决,使用
% O# g& h: x8 [) G# N$ F9 c/ H7 `9 P. I: i7 R
select distinct * from tableName
! n8 \1 h7 d6 U0 E' Z/ y4 S" X& s6 e
, l3 G) r- A+ ?; `5 A _
就可以得到无重复记录的结果集。8 k4 }7 `) _& ^8 O$ t% w' o
5 b) }3 U5 s, }+ D+ `: q+ _
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
% M0 F1 j/ R1 x+ c8 l% F8 t( g0 {! e
select distinct * into #Tmp from tableName& a. e! j) ]& O' `4 s5 _
drop table tableName5 B% `, z" P1 w$ R8 ?0 {
select * into tableName from #Tmp0 T+ C9 o! d/ Z
drop table #Tmp ; U/ B5 i! V( B3 Q5 V7 j
1 V5 U' S0 ^4 D! E( w( j+ b/ d
6 r* H0 D% g6 I3 p5 ~ 发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。6 o9 Q5 p: {& c. x# U
1 H! u/ D" t+ q& j
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
6 v/ h; u- i- o0 Q# ^5 A9 B
$ g; E( Q& p" | 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
3 o- _* Z: S( ]% i; f7 G0 @1 G+ u- `+ u2 m5 L, w, m9 x, [
select identity(int,1,1) as autoID, * into #Tmp from tableName
7 [- j" U' p7 |+ v, E- U- qselect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
1 U& h/ G6 a. u0 eselect * from #Tmp where autoID in(select autoID from #tmp2)
8 E6 J6 M4 t, H4 O' y0 b0 a7 Q2 o8 \ S
, q$ C S R+ v- O9 y0 h/ i4 a" R6 }) U: \
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
& u% f3 f! Q/ U9 Z' t
/ y( R! z) W+ T; z. h0 [; n 查询分析器不能单步调试的的原因3 J; B# t3 _8 h8 G. N
$ D# s0 {& p$ K& M- N1 W" U 具体步骤如下: 2 k: |, R9 u+ I. i
/ _3 Y4 ` [- i. c* P
1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
y* C5 v# O7 c# }
7 V8 x0 T6 I" F4 \7 U 2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
2 L8 G* ~ Z1 \8 n* X# B7 w; k% e, f- N
3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
. Y$ o B7 Y9 Y) `/ d a、在【服务器】上运行dcomcnfg.exe;
$ v4 r# a1 L: D4 A4 @* B8 ^
: U: r2 N' V; R b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; + G5 ^9 s# S6 F, {
6 W4 E, p0 p/ [4 K* t
c、重新启动SQL Server服务; 5 F6 e7 c0 A3 l2 y& j% a4 j; R7 I3 Y
' W3 C2 F/ Z4 W, t# G 3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
, T, u5 A( h; ]. y 注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|