SQL比较数据库之间的两个存储过程

时间:2014-06-23 22:35:53

标签: sql sql-server sqldmo sql-smo

我有两个版本的相同数据库,需要在它们之间驻留一些对象(存储过程,视图等)

实际上?使用SQLDMO-SQLSMO检索每个对象的Text然后执行文本比较。这是有效的,但如果我有更多的tan 1000+对象,则需要很长时间。

我的问题是。有一种简单的方法可以进行这种比较吗?也许是在数据库上生成的MD5密钥?

2 个答案:

答案 0 :(得分:1)

为什么不直接从SQL服务器查询定义而不是使用管理对象的开销?

SELECT
    sysobjects.name AS [Object Name]
    ,(CASE sysobjects.xtype
        WHEN 'P' THEN 'Stored Procedure'
        WHEN 'TF' THEN 'Function'
        WHEN 'TR' THEN 'Trigger'
        WHEN 'V' THEN 'View' END) AS [Object Type]
    ,syscomments.text AS [Object Definition]
FROM 
    sysobjects
JOIN
    syscomments
    ON
    sysobjects.id = syscomments.id
WHERE 
    sysobjects.xtype in ('P', 'TF', 'TR', 'V')
    AND 
    sysobjects.category = 0

我针对我在这里的数据库运行了它。它在0.6秒内返回了约1,500个定义。如果针对每个服务器运行该操作以收集所有定义,则可以在一个大循环中对对象名称,类型和定义进行比较。

这将是一个昂贵的记忆操作,但应该很快。大部分CPU时间都用于进行实际的字符串比较。

至于你关于"键"的其他问题。您可以比较,我知道没有这样的哈希或等价物。在sys.syscomments表中,您有ctext列(SQL定义的原始字节)和text列,它们是这些字节的文本表示。

仅供参考:如果您拥有Visual Studio 2010 Premium或更高版本,那么内置的架构比较工具将为您完成所有这些工作。还有Open DBDiffmany others免费。

答案 1 :(得分:1)

我正在使用校验和(文本)进行比较。但是如果程序开头有回车或空格,与Visual Studio模式比较工具相比,你会得到意想不到的结果。