您的位置:首页 > 数据库

两库之间重复数据判断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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: