- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
: m4 g. [* V- C9 o* j) r) E6 ?# X% L3 U- N5 j
方法一, C, z! }. E! y3 @- \9 ^
5 [' r9 J3 X' Q1 i" o
declare @max integer,@id integer' `' m3 Z" `- M# S# W% z/ Z$ |" a
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1. \3 ^+ w; \2 e7 V& [- {/ l
open cur_rows
5 r0 i' ]; m* n. J0 j/ ?fetch cur_rows into @id,@max- q* B& k0 e* A$ a
while @@fetch_status=0: Q9 }7 ]! s" W( @7 A
begin
) T: g; o* @. C8 F2 v9 }select @max = @max -19 c* i# `9 ~3 f; c3 K U) y
set rowcount @max4 j3 s/ P( w" j& W1 p+ |
delete from 表名 where 主字段 = @id L2 E# {& s4 ]- l# s3 E
fetch cur_rows into @id,@max5 Q9 o' n# j c, L
end" R6 Q1 e. g# q0 R3 K6 x! b
close cur_rows f1 q6 |% M4 T" C* `, K
set rowcount 0; I/ k# Y; C n2 K! W; j
4 y' w$ s) |! T. h/ _5 W( M) ^4 l
: |# i* @. y5 H7 M方法二8 f. F" z7 t; ~8 T
7 h5 I9 B! P# K. A$ ? 有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。% H1 b9 \; p& V2 ^8 Y) Q
) }8 u- A8 ]& u6 d+ u( {6 ?+ G 1、对于第一种重复,比较容易解决,使用
2 I: h7 V8 P- Z z9 R$ r3 t) p8 }' N6 G* W! c1 S& V/ O! {
select distinct * from tableName ~. y+ k+ Z( ?3 L: ^
7 ~2 j x% S+ ?5 a2 k
0 f* X! S: S5 v- W 就可以得到无重复记录的结果集。
2 D6 H$ D+ n* g$ ]( m
/ ]# R) ]* U8 \ X/ a8 n2 Q4 |$ M 如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
# w E$ \7 n1 |
% ]- @: m! Y: v; c+ {select distinct * into #Tmp from tableName
& y& }* H( A# t7 l/ }drop table tableName
# o* i" ~& G, z# M8 j$ }3 n$ O8 b$ G, s% |select * into tableName from #Tmp
0 g- H T& W! ]2 M$ Xdrop table #Tmp : h" y% K' Q* T ]
* z! U4 {1 n0 N6 I. C+ q1 M: n: v
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
. s2 G I, ~% L- l4 z" C5 F+ S9 }5 w( A
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下. I7 q1 W3 W" E+ J. i1 O* i; W
" W9 P* i) {3 e. p% |( P# [# ]( v3 h 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
; \( E0 H5 C! x7 j8 F
8 I3 }' [: ]6 ~4 j- e: Tselect identity(int,1,1) as autoID, * into #Tmp from tableName
3 ~+ Z/ Q1 ~8 t" [' r8 R$ ]% vselect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
9 c6 @3 \; L! W5 x/ P: Mselect * from #Tmp where autoID in(select autoID from #tmp2) N# W0 E0 K; G# N; ^
; q/ C2 G' z/ G6 l6 a
" S- ~: `, r6 [9 ^# G3 z, K: K* Z+ q
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列) @8 E p& Y4 k) \5 d5 ^6 W# |
6 h+ z: p8 I; `" \5 T, ^; R) p3 T+ [ 查询分析器不能单步调试的的原因
. M$ L u8 B; Q$ ~4 L$ ~: ^2 \8 {9 [* Y: X# T2 B4 @: G
具体步骤如下:
% U, q! a b( d8 a# ^
7 u$ M; Y% W/ x% o. ]0 t 1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) - W- _) X) m# u6 {: _
8 M8 X) J. Y$ G0 T, L 2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
8 w& ?: m+ c# B2 ]8 }# M- _3 p
0 b5 G$ n2 S' `$ X9 N" Q 3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: 9 Y% w4 ]9 V' m* j4 C
a、在【服务器】上运行dcomcnfg.exe; , C8 @7 c' m2 `: O+ H
! [: l% F2 Y' \& K9 H% v& M
b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; u: x& h) A' |6 F$ Y7 p
2 T! d) [& U5 D2 b2 k4 {0 }
c、重新启动SQL Server服务;
* h- ~" Y; W5 H9 t7 B/ G& B$ R, M1 {& K
0 C+ \. f7 B' ^( b$ e 3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 6 b. V; F) d- G- Z+ @+ \8 v7 g
注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|