SQL--比较两个数据库的表结构

原创 2017年05月22日 15:21:03

在开发过程中,经常会遇到测试数据库和正式数据库的表结构不一致的情况
今天总结一下我的解决办法

USE Test_1
DECLARE @tableCount INT
SELECT @tableCount = COUNT(1) FROM [sysobjects] WHERE [xtype] = 'U'
--将此数据库中的所有表名插入到临时表中
SELECT IDENTITY(INT,1,1) AS ID, [name] INTO #TmpTable FROM [sysobjects] WHERE [xtype] = 'U' ORDER BY [name]
--SELECT * FROM #TmpTable

DECLARE @tableName VARCHAR(100)
DECLARE @tableIndex INT
SET @tableIndex = 1
WHILE @tableIndex <= @tableCount
BEGIN
    SELECT @tableName = Name FROM #TmpTable WHERE ID = @tableIndex
    SET @tableIndex = @tableIndex + 1
    --测试库
    USE Test_1
    SELECT
        SO.[name] AS TableName
        ,SC.[name] AS ColumnName
        ,ST.[name] AS ColumnType
        ,COLUMNPROPERTY(SC.[id], SC.[name], 'PRECISION') AS ColumnLength
        ,CASE SC.[isnullable]
            WHEN 1 THEN '√'
            ELSE ''
            END AS IsAllowNull
        ,ISNULL(SCM.text, '') AS DefaultValue
    INTO #TmpTable1
    FROM [syscolumns] SC
    JOIN [sysobjects] SO ON SO.id = SC.id AND SO.[xtype] = 'U'
    LEFT JOIN [systypes] ST ON ST.[xusertype] = SC.[xtype]
    LEFT JOIN [syscomments] SCM ON SCM.[id] = SC.[cdefault]
    WHERE SO.[name] = @tableName
    ORDER BY SC.[colid]
    --正式库
    USE Test_2
    SELECT
        SC.[name] AS ColumnName
        ,ST.[name] AS ColumnType
        ,COLUMNPROPERTY(SC.[id], SC.[name], 'PRECISION') AS ColumnLength
        ,CASE SC.[isnullable]
            WHEN 1 THEN '√'
            ELSE ''
            END AS IsAllowNull
        ,ISNULL(SCM.text, '') AS DefaultValue
    INTO #TmpTable2
    FROM [syscolumns] SC
    JOIN [sysobjects] SO ON SO.id = SC.id AND SO.[xtype] = 'U'
    LEFT JOIN [systypes] ST ON ST.[xusertype] = SC.[xtype]
    LEFT JOIN [syscomments] SCM ON SCM.[id] = SC.[cdefault]
    WHERE SO.[name] = @tableName
    ORDER BY SC.[colid]

    IF EXISTS (
        SELECT * FROM #TmpTable1 A
        FULL OUTER JOIN #TmpTable2 B ON A.ColumnName = B.ColumnName
        WHERE A.ColumnName <> B.ColumnName OR A.ColumnType <> B.ColumnType OR A.ColumnLength <> B.ColumnLength OR A.IsAllowNull <> B.IsAllowNull OR A.DefaultValue <> B.DefaultValue OR A.ColumnName IS NULL OR B.ColumnName IS NULL
    )
    SELECT * FROM #TmpTable1 A
    FULL OUTER JOIN #TmpTable2 B ON A.ColumnName = B.ColumnName
    WHERE A.ColumnName <> B.ColumnName OR A.ColumnType <> B.ColumnType OR A.ColumnLength <> B.ColumnLength OR A.IsAllowNull <> B.IsAllowNull OR A.DefaultValue <> B.DefaultValue OR A.ColumnName IS NULL OR B.ColumnName IS NULL

    DROP TABLE #TmpTable1
    DROP TABLE #TmpTable2
END

DROP TABLE #TmpTable

运行结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

SQL - 比较两个数据库的Schema 表结构

如果需要比较两个数据库的结构,可以参考以下脚本: 使用时请将其中的YourSourceDB及YourTargetDB替换成需要比较的两个DB。 DECLARE @Sourcedb sysname D...
  • yuxuac
  • yuxuac
  • 2017年11月02日 14:00
  • 69

SQL Server 比较两个数据库的视图和存储过程结构差异

IF EXISTS ( SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo]....

两个数据库表结构比较(C#)

  • 2010年06月25日 16:36
  • 551KB
  • 下载

SQL语句:在两个数据库间复制表结构和更新数据

一、如果两个数据库在同一台服务器上 1、复制表结构和数据:SELECT * INTO DatabaseB.dbo.TableB FROM DatabaseA.dbo.TableA 2、仅仅复制表结...

两个数据库比较 对比视图存储过程及表结构差异

一、视图和存储过程比较【原理】利用系统表“sysobjects"和系统表“syscomments”,将数据库中的视图和存储过程进行对比。系统表"sysobjects"之前有详细介绍过,有兴趣可以看看:...
  • lee576
  • lee576
  • 2014年02月19日 13:11
  • 4353

比较两个数据库的表结构差异

/*--比较两个数据库的表结构差异  http://blog.csdn.net/zjcxc/article/details/20088 --邹建 2003.9(引用请保留此信息)--*/ /*-...
  • zjg528
  • zjg528
  • 2013年03月24日 09:57
  • 391

两个数据库比较 对比视图存储过程及表结构差异

两个数据库比较 对比视图存储过程及表结构差异 一、视图和存储过程比较 【原理】利用系统表“sysobjects"和系统表“syscomments”,将数据库中的视图和存储过程进行对比。系统表"...
  • cowbo
  • cowbo
  • 2016年06月28日 11:39
  • 1941

两个数据库比较 对比视图存储过程及表结构差异

sqlserver数据库表结构、存储过程、视图的比较脚本,并返回差异结果。

比较两个mysql数据库表结构的差异

需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异。 数据库表结构的差异 注:操作均在Linux系统...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL--比较两个数据库的表结构
举报原因:
原因补充:

(最多只允许输入30个字)