- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… ' [; n; G" b" r1 F
5 G6 ~" K3 c+ r, |" V9 e* [
方法一( H# D5 S7 R' W/ i
, D/ G; c' \* a4 ~
declare @max integer,@id integer7 ~5 U$ ?& \6 s
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
8 ~) w: B5 t) E' \6 W6 t) P/ vopen cur_rows
x: @0 }& `% Ffetch cur_rows into @id,@max. x8 L7 ~6 h) N' \! n2 ^% F2 ^, Q$ G
while @@fetch_status=0
' S5 b" J% }7 N5 D9 e: nbegin
4 I; u" a" h+ ~: a8 Vselect @max = @max -1- }, X) ?' S/ x3 d+ t
set rowcount @max
% c! f6 u1 V( ]! e" p$ ^& I4 Adelete from 表名 where 主字段 = @id
" D; p3 i" ^: x F8 zfetch cur_rows into @id,@max
. M. v* O4 f0 b6 Dend7 E; [& Z; ~) s6 i3 J; ~, r( _) }" q
close cur_rows/ y Q0 ~: i; t A
set rowcount 04 R$ A# R- H1 |( J) ^0 c
" z& f$ D1 r, q, a2 |4 B: W; a! T
6 B; G p$ h1 V1 ~/ C3 W# d方法二
* N1 h3 U# w; C( |0 E v9 a! M; @; [: l! S
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
$ ~+ m( k3 U$ _% V T" Q, \; q A @5 F8 }! k2 d" u
1、对于第一种重复,比较容易解决,使用, Y" E2 L8 T# ]; K7 e" ~
7 M% v8 a# A6 T& e: fselect distinct * from tableName
9 y' Y& ~) y1 i8 R: n3 p. k
( U6 Y2 g. [2 N5 j6 U7 t# a" g" m
7 O5 ]+ O# c8 r* ~3 t 就可以得到无重复记录的结果集。/ r8 u( M7 k& [/ q; {9 d
/ I4 x- d* g: S3 E
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除3 g5 C- R) s% o, }6 m6 [3 y4 d/ S
& K# U U0 e" Q ^5 _
select distinct * into #Tmp from tableName6 o* R6 I- G8 P4 a; t
drop table tableName# \- G* U- ]6 [4 K; R7 P
select * into tableName from #Tmp0 b) X0 A$ ~8 ]) w( w
drop table #Tmp + c* t0 A7 g2 L( |3 ~0 P
( o0 y3 ]9 M9 B# Y: Z# B9 U$ h& Z+ j! y' }2 [( _0 I- L; ?
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
5 R' t0 c. r# r, ^1 ~, _$ f) q7 V# @$ U5 W4 \
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
) _2 [! M/ \; e% n1 @- f0 R4 }4 \* L; {! a2 T
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集, R! N! d1 N$ A( z' d- I- p3 C
- s* c* | u3 e& C
select identity(int,1,1) as autoID, * into #Tmp from tableName- O" M( }5 m' K. _- B) r/ g
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID+ j' R, i$ Q- T+ |/ F1 f' z
select * from #Tmp where autoID in(select autoID from #tmp2)
3 Y& ^5 w% b2 p/ W( A# L1 j- y+ T: k/ p2 }) \+ y) `0 S
& t/ `: s0 {- ]! q9 E8 o+ C( w: D 最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)+ o' r! E$ B: `5 w0 e
( Z6 X) e3 v8 Z" j5 [6 s' V1 l 查询分析器不能单步调试的的原因% L3 ]5 l" |+ y0 ~& R* ?. d" b
1 m9 _+ w: f, }5 f 具体步骤如下: ! v0 X7 ], X( x" U) h
+ L" L9 S; r( X- M* c% u5 N
1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
6 G% T, p$ g: ?8 ^ j( ?: E3 P! ]) y1 J0 @" ^
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; , U9 c4 q! Q; U% m8 {
0 b' X( z$ ?0 C. r& H# L: A$ c( z
3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: 9 p6 v6 K3 X9 j$ n; w( A
a、在【服务器】上运行dcomcnfg.exe; " ^, J+ C0 x2 p+ {
0 Z7 }4 w, o7 U9 }& u ` b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; 0 v! k8 t/ q5 G+ R! B3 j
4 N% O! Q. C+ a* F6 O% E
c、重新启动SQL Server服务; ! j. L2 s/ d- t6 r: z& j u. ?- i$ C
" N( N/ n4 P2 L' z& e1 c$ D
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
% `. e9 V/ u" S+ O 注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|