- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… , {$ Q! |% F# T7 N
: J( o5 I l+ R# S方法一
7 s. Q+ Y+ h5 a9 h s3 \1 o+ Q2 h+ T
declare @max integer,@id integer
7 P* L0 Z8 M# @. ideclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
: z- ]! ]' M8 @/ [. Popen cur_rows i5 G6 }: h) l" ?* T$ @
fetch cur_rows into @id,@max
4 b& l* {6 q5 J1 g" E+ Fwhile @@fetch_status=05 @5 W9 y; l+ n
begin
' C- J" H% n$ ^3 K" O2 Aselect @max = @max -16 C- ^; Q+ G6 \5 e9 ^. ?
set rowcount @max
( e& O. U0 ~' I8 _; l& Z0 \delete from 表名 where 主字段 = @id
- s4 S7 ~* B) t W9 z, R# ]fetch cur_rows into @id,@max
* }8 V3 j0 C: ~* Aend
" t t4 C9 r4 k3 ^close cur_rows; @% z4 B( n9 S+ @: f9 O
set rowcount 0
/ |7 r9 r/ ]% W/ w8 _/ f2 ^5 t! A$ y6 v6 p. C9 `: p
; e. c; G: }2 i7 n/ U
方法二8 W/ T* T4 ?: b9 I) ]; B
) r1 I* B2 C; o: R6 Y
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。3 e" p: h( F0 m) V# ?: U4 ]4 c
. f; o3 A( |3 R; u
1、对于第一种重复,比较容易解决,使用
9 ^: Z2 l" z( h# R# i+ V( p; K& y/ u9 G* I
select distinct * from tableName' L& ?0 @$ F/ E3 V: ^
, U) |" p" p6 p r$ ~1 ]
2 _5 A" N& o5 {% k- v- `
就可以得到无重复记录的结果集。
0 R& i, Z3 O7 M# Q5 _+ c. t( ~( r+ p% l, {3 A8 x2 L; K
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
4 J% b* _8 k7 T" @" K+ H
u) D9 }( e, |8 a0 X: [select distinct * into #Tmp from tableName" I# s8 Q, h5 b) j& Y) U# b4 ~
drop table tableName
" Y) w; j% U, k% U. E' wselect * into tableName from #Tmp( y. v! \# y& K- v) S
drop table #Tmp 4 e) U2 B+ Z. C' y$ Y
- P7 ]# O6 o: y7 Z6 S# S
& B% b- U" g V$ T
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。. x7 a t. P7 S1 E# [# O
, _. B2 L! H3 {1 S( l5 ^ 2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
* v' G: @; g' a: h2 g
/ X. B G" h+ W7 q- e) E/ _* ?( W0 X 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集+ j# F! ?+ C: J! ] u, o; W
% B' q# G1 o1 N) B5 U1 B. ]9 s: `3 x
select identity(int,1,1) as autoID, * into #Tmp from tableName
/ D6 N! }" ^! H& f, Mselect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
. ]0 \6 o$ A* C7 F7 m- A% Mselect * from #Tmp where autoID in(select autoID from #tmp2) ; Y# u& ^6 A( T% T" B
/ t9 M C/ z- l7 @& }% E
) @' n! v, |* A; Y6 @ 最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)& c) C0 u; S- p$ Q$ C: b
' w1 F$ F6 a4 \; A) ^) l 查询分析器不能单步调试的的原因
( ]' U4 h# t! g) ^9 k
+ R, d4 h1 n$ M9 W# e6 X5 r, H 具体步骤如下: ! F9 n7 x K! V8 F& p( V* y9 Q
" L0 p# V5 Q. m/ G+ o 1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) # D1 I& h5 M( Z* j
/ h- { m$ R. S9 o! M" b7 Z6 g6 K, }
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; . ?8 @$ b5 _# ]0 \( R7 `; @
9 f o. J3 s: g% C$ | 3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
$ ]' A; x% ]# V+ {6 H7 S; _ a、在【服务器】上运行dcomcnfg.exe; ' _2 J1 @! M7 C
+ N+ A) e5 h! u p9 l6 T6 A b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
) w! h- w7 { Y, T1 |% U5 x
, M" g1 E- W$ }9 X* j# h c、重新启动SQL Server服务;
: M2 n' |% T# O; E: \5 L( i0 C0 ~# S
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
6 Z+ W8 @0 w( E4 p; f/ E 注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。 |
|