您的位置:首页 > 数据库

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

2009-05-26 22:22 483 查看
本脚本适用于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(@DB1) Is Null
Begin
Raiserror 50001 N'无效的数据库名,@DB1设置错误。'
Return(1)
End

If db_id(@DB2) Is 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: