比较两个数据库的存储过程定义是否一致V1.0



本脚本适用于Microsoft SQL Server 2005和Microsoft SQL Server 2008环境。

 

Use master
Go
if object_ID('[sp_compareobjectdefinition]'is not null
    
Drop Procedure [sp_compareobjectdefinition]
Go
/*
    比较两个数据库的存储过程定义是否一致V1.0 OK_008 2009-5-26
*/
Create Procedure sp_CompareObjectDefinition
(
    
@DB1 nvarchar(512),
    
@DB2 nvarchar(512),
    
@Type char(2)='P',
    
@ObjectName  nvarchar(512)=null
)
As
    
/*
    参数说明
    
    @DB1            数据库名
    @DB2            数据库名
    @Type            对象类型,参照sys.objects中的type列描述
    @ObjectName        对象名称
 
    
*/
    
Set Nocount On
 
    
If @DB1=@DB2
    
Begin
        
Raiserror 50001 N'@DB1,@DB2设置不能相同。'
        
Return(1)
    
End
 
    
If db_id(@DB1Is Null
    
Begin
        
Raiserror 50001 N'无效的数据库名,@DB1设置错误。'
        
Return(1)
    
End
 
    
If db_id(@DB2Is Null
    
Begin
        
Raiserror 50001 N'无效的数据库名,@DB2设置错误。'
        
Return(1)
    
End
    
    
Set @Type=Isnull(@Type,' P')
    
    
Declare @sql nvarchar(4000),
            
@sql1 nvarchar(1000),
            
@where nvarchar(1000)
 
    
If object_id('tempdb..#ObjectDefinition'Is Not Null
        
Drop Table #ObjectDefinition
    
    
Create Table #ObjectDefinition
    (
        dbname sysname,
        name sysname,
        type 
char(2),
        definition 
nvarchar(max)
    )
    
    
Set @where=''
    
If @Type >''        
        
Set @where=' And a.Type='''+@Type+''''
 
    
If @ObjectName >''    
        
Set @where=@where+' And a.name='''+@ObjectName+''''
 
    
    
Set @sql=N'
    a.name,a.type,b.definition
        From sys.objects As a
            Inner Join sys.sql_modules As b On b.object_id=a.object_id
        Where a.is_ms_shipped=0  
'+@where+' And
                Not Exists(Select 1 From sys.extended_properties Where major_id=a.object_id And minor_id=0 And class=1 And name = N
''microsoft_database_tools_support'')'
    
Set @sql1='Use '+Quotename(@DB1)+'; Select dbname='''+@DB1+''','
 
    
Insert Into #ObjectDefinition Exec(@sql1+@sql)
    
    
Set @sql1='Use '+Quotename(@DB2)+'; Select dbname='''+@DB2+''','
    
Insert Into #ObjectDefinition Exec(@sql1+@sql)
 
    
Exec(N'
    ;With t As
    (
        Select name,Type From (Select name,Type,Definition From #ObjectDefinition Where dbname=
'''+@DB1+'''    Except Select name,Type,Definition From #ObjectDefinition Where dbname='''+@DB2+''') As a
        Union All
        Select name,Type From (Select name,Type,Definition From #ObjectDefinition Where dbname=
'''+@DB2+'''    Except Select name,Type,Definition From #ObjectDefinition Where dbname='''+@DB1+''') As b
    )
    Select Distinct a.Name As ObjectName,a.Type,
            Case When b.Name Is Not Null Then 1 Else 0 End As [
'+@DB1+'],
            Case When c.Name Is Not Null Then 1 Else 0 End As [
'+@DB2+']
        From t As a
            Left Outer Join #ObjectDefinition As b On b.name=a.name And b.DBName=
'''+@DB1+'''
            Left Outer Join #ObjectDefinition As c On c.name=a.name And c.DBName=
'''+@DB2+'''

        Order By a.Type,a.Name
    
')

    
Drop Table #ObjectDefinition
 
Go

 

 

 

posted @ 2009-05-26 22:22  ok_008  阅读(925)  评论(1编辑  收藏  举报
给我写信