- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
6 Q! p, c+ [# v$ ^3 `
$ `( p5 r, g2 I D% Z方法一 _0 `2 J5 O: ^" O5 J6 e
& b% {! {$ |; ?) l$ M
declare @max integer,@id integer9 q; ~! p1 Z% x% N' N
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 19 {5 ?3 u7 k) X/ h) b. H: S0 ^8 Z
open cur_rows5 K, H: [* e% p) f+ N
fetch cur_rows into @id,@max
8 j, L- B1 E' w: D+ Y8 Y3 P: Uwhile @@fetch_status=0
5 _% T, _ O7 h6 D- K6 nbegin
; o* r9 N. B# n9 nselect @max = @max -1. }, w7 a: w' @5 ~
set rowcount @max
- @, {/ ]3 o9 K6 Tdelete from 表名 where 主字段 = @id8 h# q4 c- d+ L* M: [1 f3 G1 u
fetch cur_rows into @id,@max ~# W2 Z9 N. f8 t9 g! I3 ~
end* w( \3 a1 F [- b i
close cur_rows% b: S3 ~/ o# t0 |: z) C4 |
set rowcount 0
3 U4 x: M' J" ^! Y! c0 D8 h5 W
1 `' m6 O$ |8 } F* k6 t" s8 k6 ~2 `
方法二
4 a+ w) W9 b& F3 N: F7 g, f9 j, C. h: K3 K
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
. _6 u5 O& ], M+ r, i) O/ K7 M; j* {& Y9 ~) H E. Z: i+ M+ h3 a
1、对于第一种重复,比较容易解决,使用6 s. |+ f1 n! V9 n
6 R B; h2 S2 j- Z+ e2 T4 y
select distinct * from tableName
; S9 e) {: M( L) N' Y1 X" l4 y# }. n+ z
- \8 ?/ ^5 P) {* @& _% U6 }% I0 S* x( U% `. d2 a: |6 i1 R# U6 C
就可以得到无重复记录的结果集。
7 \* t5 s: C9 Z2 Y; C# G J& M% q% G# Z5 F l( M: U% v* A# v
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除" M6 H7 I7 f1 {4 h6 E, r! z9 b
. B7 W+ }+ G* v% y+ Y; ^) ?. _7 P. `
select distinct * into #Tmp from tableName
0 u0 `' j; N# F; l8 w6 `9 ^0 ^2 J% Adrop table tableName
' O# r& D2 { R0 G( Yselect * into tableName from #Tmp
$ F: b+ X' I; F+ Ddrop table #Tmp $ P3 L0 L$ H4 W O8 O0 s
2 x' t, L4 |, F7 N& `
! I' |* U7 F- g1 k# r
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
4 \6 T9 j O" }8 g& J) g
0 Z; N: |# H# a+ f 2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
" @! b/ T- \- g7 s# ?5 v
( {3 \& f P z 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
/ [ ^% u; c- P
- f2 k' y8 K* Uselect identity(int,1,1) as autoID, * into #Tmp from tableName- n6 b' a& f; C+ {
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
9 ~* U+ k$ o& N* b5 Xselect * from #Tmp where autoID in(select autoID from #tmp2) ; F6 E3 ?& n6 o) l4 v6 t' k+ S, L
- Q2 G: C+ g8 p+ s% G5 g# R* ?! M9 E- k/ V: u% c! ^
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
9 w" E4 C; I: W. b ~7 I* [5 U$ X7 E* t& K1 M% v S$ f$ f0 G
查询分析器不能单步调试的的原因
2 T. ~7 R; P M0 I ?$ e! n- X' n' W# u8 S% j# Y
具体步骤如下: + B) [' F& d# M2 h
) K; k% Y4 v3 T. T 1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
' ]4 L( E+ R8 W% {- X+ Y
& f+ X G( T3 {, ~7 Q% r 2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
& U! e1 n! ~0 Y, C7 ~: Q- K: X4 }
: d! x- n+ l6 u; i- U% g" r0 m 3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
% b; ^; h- N) J8 q# @9 T4 T a、在【服务器】上运行dcomcnfg.exe; & U4 w& n& B* g4 Y) ^
, z; u9 c/ |) u: W* R+ B& K4 g
b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
; m6 Q7 L3 J' ` U7 }$ N! ?9 P% {! x# i+ c1 G, V8 F1 k" i/ B! C
c、重新启动SQL Server服务;
3 ?8 Y* `! w4 ]5 W% f) d* j+ _' j9 u% V0 J
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
7 l- R. I8 R2 w 注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|