查询重复记录

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_qry]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

drop procedure [dbo].[p_qry]

GO

/*--查询重复记录的通用存储过程

可以查询出表中那些数据是重复的,这里的重复,是指除主键外重复的记录

如果表中有主键,请指定主键.

如果表中有标识字段,而且标识字段无重复,请在调用时,将主键指定为标识字段

如果标识字段重复,不能用此存储过程

-- 2004.4--*/

create proc p_qry

@tbname sysname, --要查询的表名

@keyfdname sysname=null --表中的主键,如果未指定,则表中无主键

as

declare @nokey bit,@fd varchar(8000),@tj varchar(8000)

set nocount on

if isnull(@keyfdname,'')=''

begin

select @keyfdname=cast(newid() as char(36)),@nokey=1

exec('alter table ['+@tbname+'] add ['+@keyfdname+'] decimal(38,0) identity(1,1)')

end

select @fd='',@tj=''

select @fd=@fd+',['+name+']'

,@tj=@tj+'['+name+']=a.['+name+'] and '

from syscolumns

where object_name(id)=@tbname and name<>@keyfdname

set @fd=substring(@fd,2,8000)

exec('select '+@fd+' from ['+@tbname+'] a

where exists(select 1 from ['+@tbname

+'] where a.['+@keyfdname+'])'"'+@tj+'['+@keyfdname+']<>a.['+@keyfdname+'])')

if @nokey=1

exec('alter table ['+@tbname+'] drop column ['+@keyfdname+']')

set nocount off

go

--调用示例

--创建测试数据

create table 表(f1 int,f2 int,f3 int,f4 int,f5 int)

insert into 表

select 1,1,1,1,1

union all select 2,1,1,1,1

union all select 3,2,1,23,1

union all select 4,2,3,1,3

union all select 5,1,1,1,1

go

--调用通用存储过程实现楼主的查询

exec p_qry '表','f1'

--删除测试环境

drop table 表

/*--测试结果

f2 f3 f4 f5

----------- ----------- ----------- -----------

1 1 1 1

1 1 1 1

1 1 1 1

--*/

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
>>返回首页<<
© 2005- 王朝网络 版权所有