对于连接到的2个数据库,进行表结构的对比,首先需要连接到另一数据库
exec sp_addlinkedserver 'TSQL_Test','SQL','SQLOLEDB','127.0.0.1'--ip根据实际来
exec sp_addlinkedsrvlogin 'TSQL_Test','false',null,'sa','123456'--sa为登录用户名,自行替换,123456为登录密码,自行替换
go
在结束后记得释放远程连接
exec sp_dropserver 'TSQL_Test','droplogins'
查询数据库有差异的表
--OtherDataBase为另一数据库名,根据实际自行替换
SELECT NTABLE = A.NAME, OTABLE = B.NAME
FROM SYSOBJECTS A
LEFT JOIN TSQL_Test.OtherDataBase.dbo.SYSOBJECTS B
ON A.NAME = B.NAME
WHERE ISNULL(B.NAME, '') = ''
AND A.XTYPE = 'U'
UNION ALL
SELECT NTABLE = B.NAME, OTABLE = A.NAME
FROM TSQL_Test.OtherDataBase.dbo.SYSOBJECTS A
LEFT JOIN SYSOBJECTS B
ON A.NAME = B.NAME
WHERE ISNULL(B.NAME, '') = ''
AND A.XTYPE = 'U'
ORDER BY 1, 2
比较两个数据库中每个表字段的差异
--OtherDataBase为另一数据库名,根据实际自行替换
SELECT
表名A = CASE WHEN ISNULL(A.TABLENAME, '') <> '' THEN A.TABLENAME ELSE B.TABLENAME END,
字段名A = A.FIELDNAME,
字段名B = B.FIELDNAME,
顺序= A.FIELDSNO,
说明= CASE WHEN A.FIELDTYPE <> B.FIELDTYPE THEN '类型: ' + A.FIELDTYPE + '-->' + B.FIELDTYPE
WHEN A.FIELDSNO <> B.FIELDSNO THEN '顺序: ' + str(A.FIELDSNO) + '-->' + str(B.FIELDSNO)
WHEN A.LENGTH <> B.LENGTH THEN '长度: ' + str(A.LENGTH) + '-->' + str(B.LENGTH)
WHEN A.LENSEC <> B.LENSEC THEN '小数位: ' + str(A.LENSEC) + '-->' + str(B.LENSEC)
WHEN A.ALLOWNULL <> B.ALLOWNULL THEN '允许空值: ' + str(A.ALLOWNULL) + '-->' + str(B.ALLOWNULL)
END
FROM (SELECT
TABLENAME = B.NAME,
FIELDNAME = A.NAME,
FIELDSNO = A.COLID,
FIELDTYPE = C.NAME,
LENGTH = A.LENGTH,
LENSEC = A.XSCALE,
ALLOWNULL = A.ISNULLABLE
FROM SYSCOLUMNS A
LEFT JOIN SYSOBJECTS B
ON A.ID = B.ID
LEFT JOIN SYSTYPES C
ON A.XUSERTYPE = C.XUSERTYPE
WHERE B.XTYPE = 'U') A
FULL JOIN (SELECT
TABLENAME = B.NAME,
FIELDNAME = A.NAME,
FIELDSNO = A.COLID,
FIELDTYPE = C.NAME,
LENGTH = A.LENGTH,
LENSEC = A.XSCALE,
ALLOWNULL = A.ISNULLABLE
FROM TSQL_Test.OtherDataBase.dbo.SYSCOLUMNS A
LEFT JOIN TSQL_Test.OtherDataBase.dbo.SYSOBJECTS B
ON A.ID = B.ID
LEFT JOIN TSQL_Test.OtherDataBase.dbo.SYSTYPES C
ON A.XUSERTYPE = C.XUSERTYPE
WHERE B.XTYPE = 'U') B
ON A.TABLENAME = B.TABLENAME
AND A.FIELDNAME = B.FIELDNAME
WHERE ISNULL(A.TABLENAME, '') = ''
OR ISNULL(B.TABLENAME, '') = ''
OR A.FIELDTYPE <> B.FIELDTYPE
OR A.FIELDSNO <> B.FIELDSNO
OR A.LENGTH <> B.LENGTH
OR A.LENSEC <> B.LENSEC
OR A.ALLOWNULL <> B.ALLOWNULL
ORDER by 1, 4