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