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 ' + @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 11 1 1 11 1 1 1-- */
本文转自高海东博客园博客,原文链接http://www.cnblogs.com/ghd258/archive/2005/10/24/260769.html,如需转载请自行联系原作者