我有两个版本的同一数据库,需要在它们之间存储一些对象(存储过程、视图等)
实际上 ?m 使用 SQLDMO-SQLSMO 来检索每个对象的文本,然后我执行文本比较。这是有效的,但如果我有更多的棕褐色 1000 多个对象,则需要很长时间。
我的问题是。有一种简单的方法来执行这种比较?也许是在数据库上生成的 MD5 密钥?
我有两个版本的同一数据库,需要在它们之间存储一些对象(存储过程、视图等)
实际上 ?m 使用 SQLDMO-SQLSMO 来检索每个对象的文本,然后我执行文本比较。这是有效的,但如果我有更多的棕褐色 1000 多个对象,则需要很长时间。
我的问题是。有一种简单的方法来执行这种比较?也许是在数据库上生成的 MD5 密钥?
为什么不直接从 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 DBDiff或许多其他免费的。
我正在使用校验和(文本)进行比较。但是如果在程序的开头有回车或空格,与 Visual Studio 架构比较工具相比,您会得到意想不到的结果。