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

Posted

技术标签:

【中文标题】SQL比较数据库之间的两个存储过程【英文标题】:SQL Comparing two Stored procedures between databases 【发布时间】:2014-06-23 22:35:53 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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 DBDiff 或many others 是免费的。

【讨论】:

非常感谢您的帮助,我会尝试一下。但我在想也许 sql 有一个不需要完整对象定义就可以提供帮助的键。 我所知道的没有这样的散列或等价物。在sys.syscomments 表中,您有ctext 列(SQL 定义的原始字节)和text 列,它是这些字节的文本表示。仅供参考:如果您拥有 Visual Studio 2010 Premium 或更高版本,则有一个内置的架构比较工具可以为您完成这一切。还有Open DBDiff 或many others 是免费的。 非常感谢您的帮助。我已经有了自己的架构比较,您的建议可以加快速度。【参考方案2】:

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

【讨论】:

以上是关于SQL比较数据库之间的两个存储过程的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL SQL:比较两个存储过程返回的引用游标结果

存储过程跟SQL语句比较,各有啥优点和缺点?

sql日期比较大小

mysql 与oracle中的存储过程及函数有啥区别,尽可能详细哦

SQL之存储过程详细介绍及语法(篇幅比较长慢慢看)

什么选择 EF 与存储过程或 EF 与 T-SQL 语句