两库之间重复数据判断SQL
2013-05-28 11:50
99 查看
--自增重复
DECLARE @nsql NVARCHAR(4000) ,
@count INT ,
@tb NVARCHAR(255),@col NVARCHAR(128)
DECLARE cu CURSOR
FOR
SELECT '
select @count=count(1) from
(select ' + QUOTENAME(col) + ' from ' + QUOTENAME(sch) + '.' + QUOTENAME(tb) + '
INTERSECT
select ' + QUOTENAME(col) + ' from aliebo.' + QUOTENAME(sch) + '.' + QUOTENAME(tb) + ') as aa
', QUOTENAME(sch) + '.' + QUOTENAME(tb),QUOTENAME(col)
FROM ( SELECT a.NAME sch, b.NAME tb, c.NAME col
FROM sys.schemas a ,
sys.all_objects b ,
sys.all_columns c
WHERE a.schema_id = b.schema_id
AND b.type = 'u'
AND b.object_id = c.object_id
AND c.is_identity = 1
INTERSECT
SELECT a.NAME sch, b.NAME tb, c.NAME col
FROM aliebo.sys.schemas a ,
aliebo.sys.all_objects b ,
aliebo.sys.all_columns c
WHERE a.schema_id = b.schema_id
AND b.type = 'u'
AND b.object_id = c.object_id
AND c.is_identity = 1
) AS aa
OPEN cu
FETCH NEXT FROM cu INTO @nsql, @tb,@col
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_executesql @nsql, N'@count int output', @count OUTPUT
IF @count > 0
PRINT @tb +' '+@col
FETCH NEXT FROM cu INTO @nsql, @tb,@col
END
CLOSE cu
DEALLOCATE cu
--------------
--非子自增主键重复
SET NOCOUNT ON ;
--主键列表
WITH pk
AS ( SELECT d.name sch, c.name tbl, e.name col, e.is_identity
FROM sys.index_columns a ,
sys.indexes b ,
sys.all_objects c ,
sys.schemas d ,
sys.all_columns e
WHERE a.index_id = b.index_id
AND a.object_id = b.object_id
AND b.is_primary_key = 1
AND a.object_id = c.object_id
AND c.schema_id = d.schema_id
AND b.object_id = e.object_id
AND a.column_id = e.column_id
AND e.name NOT IN ( 'createtime_forpart' )
),
tb
AS (
--有非自增列参与主键
SELECT DISTINCT
d.name sch, c.name tbl
FROM sys.index_columns a ,
sys.indexes b ,
sys.all_objects c ,
sys.schemas d ,
sys.all_columns e
WHERE a.index_id = b.index_id
AND a.object_id = b.object_id
AND b.is_primary_key = 1
AND a.object_id = c.object_id
AND c.schema_id = d.schema_id
AND b.object_id = e.object_id
AND a.column_id = e.column_id
AND e.name NOT IN ( 'createtime_forpart' )
AND e.is_identity = 0
)
SELECT a.sch, a.tbl tb, STUFF(( SELECT ',' + QUOTENAME(col)
FROM pk
WHERE sch = a.sch
AND tbl = a.tbl
FOR
XML PATH('')
), 1, 1, '') AS col
INTO #t
FROM tb a
DECLARE @nsql NVARCHAR(4000) ,
@count INT ,
@tb NVARCHAR(255) ,
@col NVARCHAR(128)
DECLARE cu CURSOR
FOR
SELECT
--*
'
select @count=count(1) from
(select ' + col + ' from ' + QUOTENAME(sch) + '.' + QUOTENAME(tb) + '
INTERSECT
select ' + col + ' from aliebo.' + QUOTENAME(sch) + '.' + QUOTENAME(tb) + ') as aa
', QUOTENAME(sch) + '.' + QUOTENAME(tb), col
FROM #t
-- WHERE col LIKE '%,%'
OPEN cu
FETCH NEXT FROM cu INTO @nsql, @tb, @col
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC sp_executesql @nsql, N'@count int output', @count OUTPUT
IF @count > 0
PRINT @tb + ' ' + @col
END TRY
BEGIN CATCH
END CATCH
FETCH NEXT FROM cu INTO @nsql, @tb, @col
END
CLOSE cu
DEALLOCATE cu
DROP TABLE #t
----无自增和主键
SELECT QUOTENAME(sch) + '.' + QUOTENAME(tbl) AS tb
FROM ( SELECT a.name sch, b.name tbl
FROM sys.schemas a ,
sys.all_objects b
WHERE a.schema_id = b.schema_id
AND b.type = 'u'
EXCEPT
( SELECT d.name sch, c.name tbl
FROM sys.index_columns a ,
sys.indexes b ,
sys.all_objects c ,
sys.schemas d ,
sys.all_columns e
WHERE a.index_id = b.index_id
AND a.object_id = b.object_id
AND b.is_primary_key = 1
AND a.object_id = c.object_id
AND c.schema_id = d.schema_id
AND b.object_id = e.object_id
AND a.column_id = e.column_id
UNION
SELECT a.NAME sch, b.NAME tb
FROM sys.schemas a ,
sys.all_objects b ,
sys.all_columns c
WHERE a.schema_id = b.schema_id
AND b.type = 'u'
AND b.object_id = c.object_id
AND c.is_identity = 1
)
) AS aa
ORDER BY tb
DECLARE @nsql NVARCHAR(4000) ,
@count INT ,
@tb NVARCHAR(255),@col NVARCHAR(128)
DECLARE cu CURSOR
FOR
SELECT '
select @count=count(1) from
(select ' + QUOTENAME(col) + ' from ' + QUOTENAME(sch) + '.' + QUOTENAME(tb) + '
INTERSECT
select ' + QUOTENAME(col) + ' from aliebo.' + QUOTENAME(sch) + '.' + QUOTENAME(tb) + ') as aa
', QUOTENAME(sch) + '.' + QUOTENAME(tb),QUOTENAME(col)
FROM ( SELECT a.NAME sch, b.NAME tb, c.NAME col
FROM sys.schemas a ,
sys.all_objects b ,
sys.all_columns c
WHERE a.schema_id = b.schema_id
AND b.type = 'u'
AND b.object_id = c.object_id
AND c.is_identity = 1
INTERSECT
SELECT a.NAME sch, b.NAME tb, c.NAME col
FROM aliebo.sys.schemas a ,
aliebo.sys.all_objects b ,
aliebo.sys.all_columns c
WHERE a.schema_id = b.schema_id
AND b.type = 'u'
AND b.object_id = c.object_id
AND c.is_identity = 1
) AS aa
OPEN cu
FETCH NEXT FROM cu INTO @nsql, @tb,@col
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_executesql @nsql, N'@count int output', @count OUTPUT
IF @count > 0
PRINT @tb +' '+@col
FETCH NEXT FROM cu INTO @nsql, @tb,@col
END
CLOSE cu
DEALLOCATE cu
--------------
--非子自增主键重复
SET NOCOUNT ON ;
--主键列表
WITH pk
AS ( SELECT d.name sch, c.name tbl, e.name col, e.is_identity
FROM sys.index_columns a ,
sys.indexes b ,
sys.all_objects c ,
sys.schemas d ,
sys.all_columns e
WHERE a.index_id = b.index_id
AND a.object_id = b.object_id
AND b.is_primary_key = 1
AND a.object_id = c.object_id
AND c.schema_id = d.schema_id
AND b.object_id = e.object_id
AND a.column_id = e.column_id
AND e.name NOT IN ( 'createtime_forpart' )
),
tb
AS (
--有非自增列参与主键
SELECT DISTINCT
d.name sch, c.name tbl
FROM sys.index_columns a ,
sys.indexes b ,
sys.all_objects c ,
sys.schemas d ,
sys.all_columns e
WHERE a.index_id = b.index_id
AND a.object_id = b.object_id
AND b.is_primary_key = 1
AND a.object_id = c.object_id
AND c.schema_id = d.schema_id
AND b.object_id = e.object_id
AND a.column_id = e.column_id
AND e.name NOT IN ( 'createtime_forpart' )
AND e.is_identity = 0
)
SELECT a.sch, a.tbl tb, STUFF(( SELECT ',' + QUOTENAME(col)
FROM pk
WHERE sch = a.sch
AND tbl = a.tbl
FOR
XML PATH('')
), 1, 1, '') AS col
INTO #t
FROM tb a
DECLARE @nsql NVARCHAR(4000) ,
@count INT ,
@tb NVARCHAR(255) ,
@col NVARCHAR(128)
DECLARE cu CURSOR
FOR
SELECT
--*
'
select @count=count(1) from
(select ' + col + ' from ' + QUOTENAME(sch) + '.' + QUOTENAME(tb) + '
INTERSECT
select ' + col + ' from aliebo.' + QUOTENAME(sch) + '.' + QUOTENAME(tb) + ') as aa
', QUOTENAME(sch) + '.' + QUOTENAME(tb), col
FROM #t
-- WHERE col LIKE '%,%'
OPEN cu
FETCH NEXT FROM cu INTO @nsql, @tb, @col
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC sp_executesql @nsql, N'@count int output', @count OUTPUT
IF @count > 0
PRINT @tb + ' ' + @col
END TRY
BEGIN CATCH
END CATCH
FETCH NEXT FROM cu INTO @nsql, @tb, @col
END
CLOSE cu
DEALLOCATE cu
DROP TABLE #t
----无自增和主键
SELECT QUOTENAME(sch) + '.' + QUOTENAME(tbl) AS tb
FROM ( SELECT a.name sch, b.name tbl
FROM sys.schemas a ,
sys.all_objects b
WHERE a.schema_id = b.schema_id
AND b.type = 'u'
EXCEPT
( SELECT d.name sch, c.name tbl
FROM sys.index_columns a ,
sys.indexes b ,
sys.all_objects c ,
sys.schemas d ,
sys.all_columns e
WHERE a.index_id = b.index_id
AND a.object_id = b.object_id
AND b.is_primary_key = 1
AND a.object_id = c.object_id
AND c.schema_id = d.schema_id
AND b.object_id = e.object_id
AND a.column_id = e.column_id
UNION
SELECT a.NAME sch, b.NAME tb
FROM sys.schemas a ,
sys.all_objects b ,
sys.all_columns c
WHERE a.schema_id = b.schema_id
AND b.type = 'u'
AND b.object_id = c.object_id
AND c.is_identity = 1
)
) AS aa
ORDER BY tb
相关文章推荐
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- SQL 删除重复的数据(多个字段判断),只保留一条数据
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- 数据库SQL语句:查询一张表中某字段重复的数据
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
- SQL删除重复数据只保留一条
- SQL 过滤重复数据
- sql根据其中一个字段去重复数据
- mysql删除重复数据的sql
- SQL删除所有重复数据。
- Mysql 查询部分字段重复数据sql语句
- Oracle Copy命令中SQL*Plus的Copy命令操作(在不同的表(同一服务器或是不同服务器)之间复制数据或移动数据)
- 【数据库SQL】找到会员卡重复的,保留其中一条数据
- sql 查出一张表中重复的所有记录数据
- SQL如何删除重复的数据行
- SQL Server中删除重复数据的几个方法
- mysql查询表重复数据的sql
- sql查询重复数据且显示出不同数据的重复次数并且排序
- 查询和删除表中重复数据sql语句
- 如何用sql语句查询和删除表中重复数据