zoukankan      html  css  js  c++  java
  • DBobjectsCompareScript(数据库对象比较).sql

    use master

    go
    IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[func_CompareDBobjectsReColumns_Temp]') AND xtype in (N'FN', N'IF', N'TF'))
    DROP FUNCTION [func_CompareDBobjectsReColumns_Temp]

    go
    create function [func_CompareDBobjectsReColumns_Temp](@objectID int)
    returns varchar(1000)
    as
    begin
        declare @str varchar(1000)
        set @str = ''
        select @str = @str + ', ' + A.name + ' ' + B.name +
        case when B.name in('int','datetime') then ''
        when B.name in('varchar','nvarchar') then '(' + cast(A.length as varchar) +')'
        else ' ' end
        --zzl
        from syscolumns A, systypes B
        where A.xtype = B.xtype and id = @objectID
       
         if(len(@str)) > 0
         begin
      set @str = ltrim(rtrim(@str))
      set @str = right(@str , len(@str) - 1)
      end
        return ltrim(rtrim(@str))
    end
    go

     declare @sqlStr nvarchar(4000),@dbCurrent nvarchar(20),@dbOK nvarchar(20),@db nvarchar(20)
     
     set @dbOK = 'UBIQTomb_Test0819'
     set @db = 'UBIQTomb'
     
     if not exists(select   1   from   master..sysdatabases   where   name= @dbOK)
     begin
          print   '不存在存在数据库名:'+ @dbOK
          return;
         end
        
     if not exists(select   1   from   master..sysdatabases   where   name= @db)
     begin
          print   '不存在存在数据库名:'+ @db
          return;
         end

     
     select @dbCurrent = db_name()
     
     --不存在的表 
     set @sqlStr = 'select * into #tableOK from '+@dbOK+'..sysobjects where xtype=''U'';'
     set @sqlStr = @sqlStr+ 'select * into #tableCurrent from '+@db+'..sysobjects where xtype=''U'';'
     set @sqlStr = @sqlStr+ 'select +''create table ''+ name +''(''+ '+@dbCurrent+'.dbo.func_CompareDBobjectsReColumns_Temp(id) +'')''  as 表不存在 from #tableOK where name not in(select name from #tableCurrent);'
     
     --不存在的列
     set @sqlStr = @sqlStr + ' select A.name as ColumnName,B.name as DataType, A.length as DataLen, C.name as TableName into #cloumnsOK '
            + ' from '+@dbOK+'..syscolumns A, '+@dbOK+'..systypes B, '+@dbOK+'..sysobjects C'
            + ' where A.xtype = B.xtype and A.id = C.id and C.xtype=''U'' and B.name != ''sysname'' and C.name in(select name from #tableOK) and C.name in(select name from #tableCurrent);'     
     set @sqlStr = @sqlStr + ' select A.name as ColumnName,B.name as DataType, A.length as DataLen, C.name as TableName, A.id as TableID  into #cloumnsCurrent '
            + ' from '+@db+'..syscolumns A, '+@db+'..systypes B, '+@db+'..sysobjects C'
            + ' where A.xtype = B.xtype and A.id = C.id and C.xtype=''U'' and B.name != ''sysname'' and C.name in(select name from #tableOK) and C.name in(select name from #tableCurrent);' 
     set @sqlStr = @sqlStr+ ' select +''alter table ''+ TableName +'' add ''+ ColumnName +'' ''+DataType+'
       +'+ case when DataType in(''int'',''datetime'') then '''' when DataType in(''varchar'',''nvarchar'',''char'',''nchar'') then ''('' + cast(DataLen as varchar) +'')'' else '' '' end as 不存在的列'
       +' from #cloumnsOK where ColumnName not in(select ColumnName from #cloumnsCurrent where #cloumnsCurrent.TableName = #cloumnsOK.TableName);'

     --数据类型不正确,或者数据长度不正确
     set @sqlStr = @sqlStr+ ' select +''alter table ''+ TableName +'' alter column ''+ ColumnName +'' ''+DataType+'
       +'+ case when DataType in(''int'',''datetime'') then '''' when DataType in(''varchar'',''nvarchar'',''char'',''nchar'') then ''('' + cast(DataLen as varchar) +'')'' else '' '' end as 数据类型不正确或者数据长度不正确'
       +' from #cloumnsOK where DataType + cast(DataLen as varchar) not in(select DataType + cast(DataLen as varchar) from #cloumnsCurrent where #cloumnsCurrent.TableName = #cloumnsOK.TableName and #cloumnsCurrent.ColumnName = #cloumnsOK.ColumnName)'
       +' and TableName + ColumnName in(select TableName + ColumnName from #cloumnsCurrent)'
     exec sp_executesql @sqlStr
     
     set @sqlStr = 'select B.name +''|''+ A.name as ''缺少自增长列的表'''
        +' from '+@dbOK+'..syscolumns A, '+@dbOK+'..sysobjects B   '
        +' where  A.id = B.id and A.typestat !=0 and A.colstat !=0 and B.xtype = ''U'''
        +' and B.name+A.name not in('
        +' select B.name + A.name '
        +' from '+@db+'..syscolumns A, '+@db+'..sysobjects B   '
        +' where  A.id = B.id and A.typestat !=0 and A.colstat !=0 and B.xtype = ''U'')'
     exec sp_executesql @sqlStr
        
     set @sqlStr = 'select B.name+''|''+A.name as ''缺少主键的表'''
       +' from '+@dbOK+'..syscolumns A, '+@dbOK+'..sysobjects B '
       +' where A.id = B.id and  A.id in(select id from '+@dbOK+'..sysconstraints) and A.colstat = 1 '
       +' and B.name+A.name not in('
       +' select B.name+A.name'
       +' from '+@db+'..syscolumns A, '+@db+'..sysobjects B '
       +' where A.id = B.id and  A.id in(select id from '+@db+'..sysconstraints) and A.colstat = 1 )'
     exec sp_executesql @sqlStr
       
     set @sqlStr = 'select name as ''缺少存储过程'' from  '+@dbOK+'..sysobjects where xtype = ''P'' '
      +' and name not in(select name from '+@db+'..sysobjects where xtype = ''P'')'  
     exec sp_executesql @sqlStr
     
     set @sqlStr = 'select name as ''缺少触发器'' from  '+@dbOK+'..sysobjects where xtype = ''TR'''
      +' and name not in(select name from '+@db+'..sysobjects where xtype = ''TR'')'  
     exec sp_executesql @sqlStr
     
     set @sqlStr = 'select name as ''缺少函数'' from  '+@dbOK+'..sysobjects where xtype = ''FN'''
      +' and name not in(select name from '+@db+'..sysobjects where xtype = ''FN'')'
     exec sp_executesql @sqlStr

     set @sqlStr = 'select name as ''缺少视图'' from  '+@dbOK+'..sysobjects where xtype = ''V'''
      +' and name not in(select name from '+@db+'..sysobjects where xtype = ''V'')'
     exec sp_executesql @sqlStr

    go
    IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[func_CompareDBobjectsReColumns_Temp]') AND xtype in (N'FN', N'IF', N'TF'))
    DROP FUNCTION [func_CompareDBobjectsReColumns_Temp]

  • 相关阅读:
    数据库02
    MySQL1
    GIL 死锁 递归锁 event 信号量 线程Queue
    小脚本 暴力删除文件 刷屏
    常见web攻击 及基础 回顾(杂记)
    接口中的简单异步 async
    python协程 示例
    python 利用jinja2模板生成html
    python 调用webservices 接口
    python 进程 进程池 进程间通信
  • 原文地址:https://www.cnblogs.com/zzlchn/p/3312060.html
Copyright © 2011-2022 走看看